題目介紹
解決方法
暴力破解
直接使用循環來進行解題
用python實現
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)):
for j in range(len(nums)):
if(nums[i]+nums[j]==target):
return [i,j]
優化
找出nums[i],創建一個新的數組儲存nums前i各元素tump=nums[:i],再在tump中遍歷尋找是否存在值爲target-nums[i]的元素,如果存在將該元素的座標賦值給j結束循環
最後返回 [j,i] 注意j在i前面
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)):
tump=nums[:i]
if((target-nums[i])in tump):
j=tump.index(target-nums[i])
break
return [j,i]
執行用時344ms
哈希表法
首先介紹:
enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合爲一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。
語法:
enumerate(sequence, [start=0])
sequence – 一個序列、迭代器或其他支持迭代對象。
start – 下標起始位置。
舉例:
a=[1,2,3,4]
for i,a in enumerate(a):
print(i,a)#i表示數據下標,a返回列表數據
# 0 1
# 1 2
# 2 3
# 3 4
代碼實現:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
hashmap={}#創建一個空字典
for i,value in enumerate(nums):#遍歷列表,value返回列表數據,i返回數據座標
#查找hashmap字典中的key是否有target-value
if target-value in hashmap:
#如果存在返回target-value對應的值與 i
return [hashmap.get(target-value),i]
hashmap[value]=i#如果不存在,將 "value":"i" 添加到hashmap字典中
兩遍哈希表
哈希表最大的優點,就是把數據的存儲和查找消耗的時間大大降低,幾乎可以看成是常數時間;而代價僅僅是消耗比較多的內存。然而在當前可利用內存越來越多的情況下,用空間換時間的做法是值得的。另外,編碼比較容易也是它的特點之一。
在第一次迭代,將每個元素和其索引值添加到字典中。然後在第二次迭代中,檢查每個元素對應的目標元素的索引值是否存在(hashmap.get(target-value)),但是目標元素的索引值不能是元素自身(hashmap.get(target-value)!=i)
#兩次遍歷哈希表
def twoSum4(nums,target):
hashmap={}
for i,value in enumerate(nums):
hashmap[value]=i
for i,value in enumerate(nums):
if (hashmap.get(target-value))and(hashmap.get(target-value)!=i):
return [i,hashmap.get(target-value)]