給定一個整數陣列 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%的使用者
- 時間複雜度:O(n)
#
# @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。