leetcode【1+167 Two Sum 系列】【python】
阿新 • • 發佈:2019-02-06
1 Two Sum
找到給定序列中兩個數字的和是指定target,返回的是個list,包含兩個數的index,從0開始。
第一反應肯定是遍歷,畢竟是陣列題,遍歷需要兩遍,才能找到和,那麼肯定是要優化的了。
因為是查詢,所以可以想到hash,查詢只需要O(1)複雜度。那麼維持一個dict,其中key是數值,value是數值對應的下標。最初的想法是從陣列中每取到一個數字nums[i],判斷nums[i]在不在dict中,後來想到它在不在沒有太大的意義,它在也要進一步判斷target-nums[i]是否存在,才能找到兩個數字,它不在那麼當然就是把nums[i]存進dict。所以呢,不如直接判斷target-nums[i]是不是在,如果在,那麼它對應的value肯定是返回陣列res[0],nums[i]所在的第i位就是res[1]了,如果不在,還是一樣把nums[i]放入。
程式碼如下:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
temp = dict()
result = [-1, -1]
for i in range(len(nums)):
if target-nums[i] in temp.keys():
result[1 ] = i
result[0] = temp.get(target - nums[i])
break
else:
temp[nums[i]] = i
return result
167 Two Sum II –Input array is sorted
跟上一題想多,改變有兩處,一個是給定的陣列是排好序的,另一個是返回的下標是從1開始的。當然後者對做題沒有什麼影響。我們仍然可以使用hash的方法來實現這個題。我也確實是這麼做的。。。那麼當第二遍做這道題的時候,我想到排序對這道題的改變,忽然就想到了two points,也就是夾逼的思想,哈哈哈。從頭和從尾同時向內逼近。
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
left = 0
right = len(numbers) -1
while(left < right):
if(numbers[left] + numbers[right] == target):
return [left+1,right+1]
elif(numbers[left] + numbers[right] < target):
left += 1
else:
right -= 1
就是這樣啦 這道題我們瞭解了夾逼、hash表。其實c++\jave\python這些都自帶hash表功能的內建資料結果的,只有c木有啦,python裡是dict(),key-value對應的這種形式。它自帶很多方法,可以很靈活的使用嗒