[演算法] LeetCode 1.兩數之和

長頸鹿大俠發表於2019-07-29

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]

[演算法] LeetCode 1.兩數之和

但注意,不要用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

[演算法] LeetCode 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])]

[演算法] LeetCode 1.兩數之和

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

[演算法] LeetCode 1.兩數之和

自己想想寫寫就明白了,字典d裡鍵值對 {k:v}的含義是,與k能湊成target的值在nums中的位置為v。(即nums[i]=k時,nums[v]+num[i]=target。)
邊在字典中記下互補這個位置(value)所需互補數(key)邊遍歷nums陣列,之後的遇到nums[i]=之前記錄的某個互補數時就是找到了,返回他的位置(value)和 i 就完成了。
[演算法] LeetCode 1.兩數之和

相關文章