題目:
1、朴素解法
1.1 最朴素的兩個for循環大法:
時間復雜度O(n2)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
但注意,不要用enumerate函數寫,會超時:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
size = len(nums)
for i, m in enumerate(nums):
j = i+1
while j < size :
if nums[i] + nums[j] == target:
return [i, j]
else:
j+=1
1.2 用in優化(表面一個循環)
python大法好:用list+in方法,只需要一個for循環就能解決問題了(但其實是python的in幫我們做了一個查找的循環)
時間復雜度O(n2)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
if target-nums[i] in nums:
if i != nums.index(target-nums[i]):
return [i, nums.index(target-nums[i])]
3、python字典模擬hash(兩遍哈希)
時間復雜度O(n)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
_dict = {}
for i, m in enumerate(nums):
_dict[m] = i
for i, m in enumerate(nums):
j = _dict.get(target - m)
if j is not None and i != j:
return [i, j]
4、python字典模擬hash(一遍哈希)
時間復雜度O(n)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
d = {}
for i in range(len(nums)):
a = target - nums[i]
if nums[i] in d:
return d[nums[i]],i
else:
d[a] = i
自己想想寫寫就明白了,字典d里鍵值對 {k:v}的含義是,與k能湊成target的值在nums中的位置為v。(即nums[i]=k時,nums[v]+num[i]=target。)
邊在字典中記下互補這個位置(value)所需互補數(key)邊遍歷nums數組,之后的遇到nums[i]=之前記錄的某個互補數時就是找到了,返回他的位置(value)和 i 就完成了。