給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。
示例:給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路:解題的關鍵是找到 " num2=target-num1" 是否在給定的整數陣列nums(list)中。使用如下的兩個方法解決:
**函式如下:
class
solution
:def
twosum
(self, nums: list[
int]
, target:
int)
: lens =
len(nums)
j=-1
for i in
range
(lens):if
(target - nums[i]
)in nums:
if(nums.count(target - nums[i])==
1)&(target - nums[i]
== nums[i]):
#如果num2=num1,且nums中只出現了一次,說明找到是num1本身。
continue
else
: j = nums.index(target - nums[i]
,i+1
)#index(x,i+1)是從num1後的序列後找num2
break
if j>0:
return
[i,j]
else
:return
執行通過,不過耗時較長,為1048ms。
在上述方法的基礎上改進演算法,想著,num2 的查詢並不需要每次從 nums 查詢一遍,只需要從 num1 位置之前或之後查詢即可。但為了方便 index 這裡選擇從 num1 位置之前查詢:
class
solution
:def
twosum
(self, nums: list[
int]
, target:
int)
-> list[
int]
: lens=
len(nums)
j=-1
for i in
range(1
,lens)
: temp=nums[
:i]if
(target-nums[i]
)in temp:
j=nums.index(target-nums[i]
)break
if j>=0:
return
[i,j]
執行通過,耗時減少一半多為444ms。
時間複雜度:對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素,所以對應的時間複雜度是o(n)*o(n);
空間複雜度是:o(n)。
這裡先將陣列排序好o(nlogn),再利用雙指標法遍歷一遍o(n)得到結果。為了儲存下標資訊另開了乙個陣列。
時間複雜度o(nlogn),空間複雜度o(n)
**如下:
class
solution
:def
twosum
(self, nums: list[
int]
, target:
int)
-> list[
int]
: temp=nums.copy(
) temp.sort(
) i=
0 j=
len(nums)-1
while iif(temp[i]
+temp[j]
)>target:
j=j-
1elif
(temp[i]
+temp[j]
)i=i+
1else
:break
p=nums.index(temp[i]
) nums.pop(p)
k=nums.index(temp[j]
)if k>=p:
k=k+
1return
[p,k]
執行通過,使用時間76ms,大幅縮短執行時間。
利用 undered_map 陣列構造對映,遍歷 nums[i] 時,看 target-nums[i] 是否存在hash表中即可。
時間複雜度o(n),空間複雜度o(n)
**如下:
class
solution
:def
twosum
(self, nums: list[
int]
, target:
int)
-> list[
int]
: hashset=
for i in
range
(len
(nums)):
if hashset.get(target-nums[i])is
notnone
:return
[hashset.get(target-nums[i]
),i]
hashset[nums[i]
]=i
執行通過,執行時間76ms。 leetCode刷題 兩數之和
兩數之和 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums...
leetCode刷題 兩數之和
兩數之和 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums...
LeetCode刷題 兩數之和
給定乙個整數陣列nums和乙個整數目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回它們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。你可以按任意順序返回答案。示例 1 輸入 nums 2,7,11,15 target 9 輸出 0,1 解釋...