目录
一、Array & Hashing 数组与哈希
217. 存在重复元素
题目页面
解法一:蛮力解法,从头开始遍历数组中的元素,对于每个元素,都将其与后面的所有元素进行比较,若有重复则返回 True,可知此解法时间复杂度为 O ( n 2 ) O({n^2}) O(n2),空间复杂度为 O ( 1 ) O(1) O(1)
解法二:排序后遍历,将数组排序之后,重复的元素一定是相邻的,所以很容易比较出来,但排序需要时间开销,所以此解法时间复杂度为 O ( n log n ) O(n\log n) O(nlogn),空间复杂度为 O ( 1 ) O(1) O(1)
解法三:哈希表,利用哈希表插入与查找都只需要常数时间的特性,把出现过的元素记录在哈希表中,若后面遍历元素时发现其已经在哈希表里了,就返回 True,时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
record = set()
for num in nums:
if num in record:
return True
else:
record.add(num)
return False
242. 有效的字母异位词
题目页面
解法一:哈希表,分别把两个字符串中的字符以及字符的出现次数记录在两个哈希表中,然后遍历哈希表看看两个哈希表的键、值是否完全一样,注意Python 中索引不存在的键会报错,要用 get 函数,时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
countS = {}
countT = {}
if len(s) != len(t):
return False
for i in range(len(s)):
countS[s[i]] = 1 + countS.get(s[i], 0)
countT[t[i]] = 1 + countT.get(t[i], 0)
for ch in countS:
if countS[ch] != countT.get(ch, 0):
return False
return True
利用 collections 里面的 Counter 可以一行解决:
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
return Counter(s) == Counter(t)
解法二:排序法,对两个字符串进行排序,判断它们是否相等即可,优化了空间但损失了时间,时间复杂度为 O ( n log n ) O(n\log n) O(nlogn),空间复杂度为 O ( 1 ) O(1) O(1)
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
return sorted(s) == sorted(t)
1. 两数之和
题目页面
解法一:蛮力解法,从头开始遍历数组中的元素,对于每个元素,都将其与后面的所有元素进行相加,判断它们的和是否等于 target,时间复杂度为 O ( n 2 ) O({n^2}) O(n2),空间复杂度为 O ( 1 ) O(1) O(1)
解法二:哈希表,把出现过的元素以及对应下标记录在哈希表中,若后面遍历元素 num 时发现 target - num 已经在哈希表里了,就返回 True,时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashmap = dict()
for i, num in enumerate(nums):
if target - num in hashmap:
return [hashmap[target - num], i]
else:
hashmap[num] = i