1. 程式人生 > 其它 >如果很好說出finalize用法,面試官會認為你很資深

如果很好說出finalize用法,面試官會認為你很資深

技術標籤:leetcodepython演算法

1.兩數之和

  • 簡單

給定一個整數陣列 nums和一個整數目標值 target,請你在該陣列中找出 和為目標值 的那 兩個 整數,並返回它們的陣列下標。

你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。

你可以按任意順序返回答案。

示例 1:

輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

輸入:nums = [3,2,4], target = 6
輸出:[1,2]

示例 3:

輸入:nums = [3,3], target = 6
輸出:[0,1]

提示:

  • 2 <= nums.length <= 103
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只會存在一個有效答案

方法一

解題思路:
就是從第一個元素開始依次挨個和後面的元素進行和運算,來查詢和為目標數的兩個數。第一個沒有就再拿第二個,第三個,直至所有元素都已組合過。這就需要進行兩層迴圈。

程式碼

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        res = []
        for
i in range(len(nums)): for j in range(i+1, len(nums)): if nums[i] + nums[j] == target: res.extend([i, j]) break return res

結果:
在這裡插入圖片描述
分析:
果然兩層迴圈的暴力列舉是佔用記憶體很大的。

  • 時間複雜度:O(N^2),其中 N 是陣列中的元素數量。最壞情況下陣列中任意兩個數都要被匹配一次。

  • 空間複雜度:O(1)

方法二

解題思路:

用單迴圈,查詢目標值減當前值的差在不在列表裡,且索引不能等於當前索引。

程式碼

class Solution:
    def twoSum1(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        res = []
        for i in range(n):
            k = target - nums[i]
            if k in nums:
                ind = nums.index(k)
                if i == ind:
                    continue
                else:
                    res.append(i)
                    res.append(ind)
                    break
        return res
if __name__ == '__main__':
    solu = Solution()
    a = solu.twoSum1([3, 3], 6)
    print(a)

結果:
在這裡插入圖片描述
分析:
一次迴圈一下子就將時間降下來了。

  • 時間複雜度:O(N)

  • 空間複雜度:O(1)

方法三

解題思路:
參考了大神們的解法,通過雜湊來求解,這裡通過字典來模擬雜湊查詢的過程。

程式碼:

class Solution:
    def twoSum3(self, nums: List[int], target: int) -> List[int]:
        hashmap = {}
        for i, num in enumerate(nums):
            if hashmap.get(target - num) is not None:
                return [i, hashmap.get(target - num)]
            hashmap[num] = i  # 這句不能放在if語句之前,解決list中有重複值或target-num=num的情況


if __name__ == '__main__':
    solu = Solution()
    a = solu.twoSum3([3, 3], 6)
    print(a)

結果:
在這裡插入圖片描述
分析:
這個結果也是快的,只是從另一個角度來解決問題。