[算法] LeetCode 1.兩數之和(python)


題目:

1、朴素解法

1.1 最朴素的兩個for循環大法:

時間復雜度O(n2)

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]

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

1.2 用in優化(表面一個循環)

python大法好:用list+in方法,只需要一個for循環就能解決問題了(但其實是python的in幫我們做了一個查找的循環)
時間復雜度O(n2)

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])]

3、python字典模擬hash(兩遍哈希)

時間復雜度O(n)

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        _dict = {}
        for i, m in enumerate(nums):
            _dict[m] = i

        for i, m in enumerate(nums):
            j = _dict.get(target - m)
            if j is not None and i != j:
                return [i, j]

4、python字典模擬hash(一遍哈希)

時間復雜度O(n)

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM