LeetCode 1.兩數之和(python)
1、樸素解法
最樸素的兩個for迴圈大法:
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
2、用 in 優化(一遍for迴圈?)
python大法好:用in方法,只需要一個for迴圈就能解決問題了(但其實是python的in幫我們做了一個查詢的迴圈)
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字典(雜湊表的演算法思想)
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 就完成了。