1. 程式人生 > >leetcode【1+167 Two Sum 系列】【python】

leetcode【1+167 Two Sum 系列】【python】

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對應的這種形式。它自帶很多方法,可以很靈活的使用嗒