暴力破解
用兩層循環進行解題,不過提交結果后提示 “超出時間限制”,這里就不做講解。
用 Python 中 list 的相關函數求解
方法一:
解題關鍵主要是想找到 num2 = target - num1,是否也在 list 中,那么就需要運用以下兩個方法:
num2 in nums,返回 True 說明有戲
nums.index(num2),查找 num2 的索引
Python
def twoSum(nums, target):
lens = len(nums)
j=-1
for i in range(lens):
if (target - nums[i]) in nums:
if (nums.count(target - nums[i]) == 1)&(target - nums[i] == nums[i]):#如果num2=num1,且nums中只出現了一次,說明找到是num1本身。
continue
else:
j = nums.index(target - nums[i],i+1) #index(x,i+1)是從num1后的序列后找num2
break
if j>0:
return [i,j]
else:
return []
執行通過,不過耗時較長,共 1636ms。
方法二:
解題思路是在方法一的基礎上,優化解法。想着,num2 的查找並不需要每次從 nums 查找一遍,只需要從 num1 位置之前或之后查找即可。但為了方便 index 這里選擇從 num1 位置之前查找:
Python
def twoSum(nums, target):
lens = len(nums)
j=-1
for i in range(1,lens):
temp = nums[:i]
if (target - nums[i]) in temp:
j = temp.index(target - nums[i])
break
if j>=0:
return [j,i]
執行通過,耗時縮短一半多,共 652ms。
用字典模擬哈希求解
方法三:
參考了大神們的解法,通過哈希來求解,這里通過字典來模擬哈希查詢的過程。
個人理解這種辦法相較於方法一其實就是字典記錄了 num1 和 num2 的值和位置,而省了再查找 num2 索引的步驟。
Python
def twoSum(nums, target):
hashmap={}
for ind,num in enumerate(nums):
hashmap[num] = ind
for i,num in enumerate(nums):
j = hashmap.get(target - num)
if j is not None and i!=j:
return [i,j]
通過字典的方法,查找效率快很多,執行速度大幅縮短,共 88ms。
方法四:
類似方法二,不需要 mun2 不需要在整個 dict 中去查找。可以在 num1 之前的 dict 中查找,因此就只需要一次循環可解決。
Python
def twoSum(nums, target):
hashmap={}
for i,num in enumerate(nums):
if hashmap.get(target - num) is not None:
return [i,hashmap.get(target - num)]
hashmap[num] = i #這句不能放在if語句之前,解決list中有重復值或target-num=num的情況
hashmap[num] = i #這句不能放在if語句之前,解決list中有重復值或target-num=num的情況
不過方法四相較於方法三的運行速度沒有像方法二相較於方法一的速度提升。運行速度在 70ms 多。