leetcode 解題 1.兩數之和-python3 兩種解法 @ 官方

娃哈哈店長發表於2019-12-26

給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個陣列中同樣的元素。

可在 twoSum中切換解題方式

暴力法

  • 遍歷每個元素 x,並查詢是否存在一個值與 target−x相等的目標元素,如果採用傳統的兩遍遍歷,時間複雜度:O(n^2)空間複雜度:O(1):

  • for i in range(len(nums)):
    for j in range(i+1,len(nums)):
        if target == nums[i] + nums[j]:
            return [i,j]
  • 推薦-採用切片:
    當第二次遍歷的時候,我們可以採用python的切片list[x:y]來重組第i個資料及其以後的資料
    再透過判斷if (target - nums[i]) in nums[i:]來解答

    • 執行用時 :820 ms, 在所有 python3 提交中擊敗了38.74%的使用者
    • 記憶體消耗 :13.7 MB, 在所有 python3 提交中擊敗了82.25%的使用者
n=0
for i in range(0,len(nums)-1):
    n+=1
    if (target - nums[i]) in nums[i+1:]:
        return [i,nums[i+1:].index(target - nums[i])+n]

雜湊表法

透過以空間換取速度的方式,我們可以將查詢時間從 O(n) 降低到 O(1)。雜湊表正是為此目的而構建的,它支援以近似恆定的時間進行快速查詢。

  • 一個簡單的實現使用了兩次迭代。
  • 在第一次迭代中,我們將每個元素的值和它的索引新增到表中。
  • 在第二次迭代中,我們將檢查每個元素所對應的目標元素(target - nums[i]target−nums[i])是否存在於表中。
  • 注意,該目標元素不能是 nums[i] 本身!
    • 時間複雜度:O(n)
      我們把包含有 n個元素的列表遍歷兩次。由於雜湊表將查詢時間縮短到 O(1)
    • 空間複雜度:O(n)
      所需的額外空間取決於雜湊表中儲存的元素數量,該表中儲存了 n 個元素
    • 執行用時 :48 ms, 在所有 python3 提交中擊敗了99.71%的使用者
    • 記憶體消耗 :14.2 MB, 在所有 python3 提交中擊敗了43.78%的使用者
#
# @lc app=leetcode.cn id=1 lang=python3
#
# [1] 兩數之和
#

# @lc code=start
import random
from typing import List
class Solution:
    def force(self, nums: List[int], target: int) -> List[int]:
        print("當前使用的暴力破解的方法\n")
        n=0
        for i in range(0,len(nums)-1):
            # print(nums[i+1:])
            # print(nums[i])
            n+=1
            if (target - nums[i]) in nums[i+1:]:
                return [i,nums[i+1:].index(target - nums[i])+n]

    def hash_map(self, nums: List[int], target: int) -> List[int]:
        print("當前使用的雜湊表方法\n")
        hashmap={}
        for i,n in enumerate(nums):
            if target - n in hashmap:
                return [hashmap.get(target - n),i]
            hashmap[n] = i

    def twoSum(self, nums: List[int], target: int) -> List[int]:
        # print('type',self.type)
        return {
            1 : lambda nums,target : self.force(nums,target),
            2 : lambda nums,target : self.hash_map(nums,target),
        }[1](nums,target)

# @lc code=end

if __name__ == "__main__":
    pass

原始碼儲存在github上,歡迎來提bug哦!-點選訪問
我的部落格地址-點選訪問
如果覺得不錯請給我一個star謝謝了Stray_Camel(^U^)ノ~YO

本作品採用《CC 協議》,轉載必須註明作者和本文連結
文章!!首發於我的部落格Stray_Camel(^U^)ノ~YO

相關文章