Leetcode 1 兩數之和

2021-09-27 13:24:29 字數 3734 閱讀 8575

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

你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。

例如給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

第一種 :python,呼叫1次迴圈(實際if判斷也相當於一次迴圈),思路和方法一相同,時間複雜度也一樣

def

twosum

(nums, target)

: 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

第二種:python的優化版本,主要是對第二種方法,對查詢範圍做了優化,始終在第乙個數的前面的範圍找第二個數,也避免了對重複元素(與第1個數重疊)的判斷

前兩種方式都是暴力解

def

twosum

(nums, target)

: lens =

len(nums)

j=-1

for i in

range(1

,lens)

: temp = nums[

:i]if

(target - nums[i]

)in temp:

j = temp.index(target - nums[i]

)break

if j>=0:

return

[j,i]

第三種,利用雜湊表

個人理解這種辦法相較於方法一其實就是字典記錄了 num1 和 num2 的值和位置,而省了再查詢 num2 索引的步驟

def

twosum

(nums, target)

: hashmap =

for ind, num in

enumerate

(nums)

: hashmap[num]

= ind

for i, num in

enumerate

(nums)

: j = hashmap.get(target - num)

if j is

notnone

and i != j:

return

[i, j]

第四種,在第四種的基礎上進行優化,主要還是優化查詢範圍

類似方法三,不需要 num2 在整個 dict(hashmap) 中去查詢。可以在 num1 之前的 dict 中查詢,因此就只需要一次迴圈可解決。

def

twosum

(nums, target)

: hashmap=

for i,num in

enumerate

(nums)

:if hashmap.get(target - num)

isnot

none

:return

[i,hashmap.get(target - num)

] hashmap[num]

= i #這句不能放在if語句之前,解決list中有重複值或target-num=num的情況

下面的**,第四種方法類似,但是效率低,因為用了in,相當於用了迴圈。

from typing import list

class

solution

:def

twosum

(self, nums: list[

int]

, target:

int)

-> list[

int]

: dict1=

for i,value in

enumerate

(nums)

: x=target-value

if x in dict1.keys():

#主要是這一句判斷不同

return

[i,dict1[x]

] dict1[value]

=i return

參考鏈結

第一種暴力解

暴力法很簡單,遍歷每個元素 ***,並查詢是否存在乙個值與 target−xtarget - xtarget−x 相等的目標元素。

class

solution;}

}}throw

newillegalargumentexception

("no two sum solution");

}}

複雜度分析:

時間複雜度:o(n2)

對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素,這將耗費 o(n)的時間。因此時間複雜度為 o(n2)。

空間複雜度:o(1)

第二種是兩遍雜湊表

以空間換時間

class

solution

for(

int i =

0; i < nums.length; i++);

}}throw

newillegalargumentexception

("no two sum solution");

}}

時間複雜度是o(n),空間複雜度也是o(n)

第三種是一遍雜湊表

class

solution;}

map.

put(nums[i]

, i);}

throw

newillegalargumentexception

("no two sum solution");

}}

時間複雜度是o(n),空間複雜度也是o(n)

LeetCode 1 兩數之和

給定乙個整數數列,找出其中和為特定值的那兩個數。你可以假設每個輸入都只會有一種答案,同樣的元素不能被重用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 step 1 class solution object def tw...

leetcode 1 兩數之和

1.兩數之和 這道題和程式設計之法上面的題目有以下幾個不同 1 題目所給定的陣列是無序的,程式設計之法裡面是預設有序的 2 要求輸出原陣列的序號,如果用乙個結構體維護陣列下標,那麼需要o n 的空間,顯然不是最好的方法 3 題目中包含負數,之前想用數值直接表示陣列下標,陣列值為原來的真正陣列下標,但...

leetcode 1 兩數之和

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 class solution for int i 0 ...