LeetCode第一題 兩數之和

2021-09-27 00:20:26 字數 4453 閱讀 8256

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

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

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

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

所以返回[0, 1]

當然是雙層迴圈了,簡單,直觀,缺點就是時間複雜度是 $ o(n^2) $

public

static string doublefor

(int

nums, integer target)}}

return

"沒有合適的值"

;}

我們可以看到,第二層迴圈其實是在尋找和target - num[i]相等的值

如何在一組數中快速查詢乙個數

public

static string buildmap

(int

nums, integer target)

for(

int i =

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

}return

"沒有合適的值"

;}

public

static

void

main

(string[

] args)

// 隨機數去重複

int[

] distinctintegers = integers.

stream()

.distinct()

.maptoint

(integer:

:intvalue)

.toarray()

; system.out.

println

("參與的總數量:"

+ distinctintegers.length)

;long firststarttime = system.

currenttimemillis()

; string s =

doublefor

(distinctintegers, target)

;long firstendtime = system.

currenttimemillis()

;long firsttime = firstendtime - firststarttime;

system.out.

println

("方式執行時間為:"

+ firsttime +

"毫秒");

system.out.

println

(s);

long secondstarttime = system.

currenttimemillis()

; string s1 =

buildmap

(distinctintegers, target)

;long secondendtime = system.

currenttimemillis()

;long secondtime = secondendtime - secondstarttime;

system.out.

println

("第二種方式執行時間為:"

+ secondtime +

"毫秒");

system.out.

println

(s1);}

====

====

====

====

====

====

====

參與的總數量:995034

doublefor方式執行時間為:

110492毫秒

沒有合適的值

buildmap方式執行時間為:

1163毫秒

沒有合適的值

====

====

====

====

====

====

====

=

只能講是天差地別。。。。

我們在優化的演算法中,先迴圈了一遍,建立map,所以在某些情況下,其實還不如雙層迴圈速度快。我們之前是判斷乙個數是否在整個輸入的陣列中存在,這是沒問題的,但是我們要先迴圈一遍陣列構建map,構建map也是需要消耗效能的,所以能不能把構建map的動作延遲

public

static string lazymap

(int

nums, integer target)

else

}return

"沒有合適的值"

;}

### 加了數字,方便比較

doublefor方式執行時間為:1336毫秒

[ 3547 ,77735 ] values:(292335 , 6314670)

buildmap方式執行時間為:1211毫秒

[ 3547 ,77735 ] values:(292335 , 6314670)

lazymap方式執行時間為:18毫秒

[ 14265 ,76774 ] values:(2103266 , 4503739)

### 這裡第二種方法是最慢的,是有這種可能的,運氣好,前幾個數就能匹配到合適的值

參與的總數量:994980

doublefor方式執行時間為:142毫秒

[ 512 ,394240 ] values:(1049692 , 7348148)

buildmap方式執行時間為:2466毫秒

[ 512 ,394240 ] values:(1049692 , 7348148)

lazymap方式執行時間為:6毫秒

[ 9201 ,34636 ] values:(4261592 , 4136248)

###參與的總數量:995028

doublefor方式執行時間為:1525毫秒

[ 4392 ,434770 ] values:(2052096 , 4910043)

buildmap方式執行時間為:1053毫秒

[ 4392 ,434770 ] values:(2052096 , 4910043)

lazymap方式執行時間為:6毫秒

[ 10162 ,20333 ] values:(5509997 , 1452142)

###參與的總數量:994959

doublefor方式執行時間為:2915毫秒

[ 7605 ,36196 ] values:(188646 , 380034)

buildmap方式執行時間為:1576毫秒

[ 7605 ,36196 ] values:(188646 , 380034)

lazymap方式執行時間為:12毫秒

[ 7605 ,36196 ] values:(188646 , 380034)

###

看來第三種方法真的是吊打。。。

1. js

function

findtwonumber

(arr, target)

else

}return

null

}

2. python
def

find_two_number

(nums, target)

: num_dict =

for index in

range(0

,len

(nums)):

num = nums[index]

cc = target - num

if num_dict.get(cc)

isnot

none

:return

"[ "

+str

(num_dict.get(cc))+

" : "

+str

(index)

+" ]"

else

: num_dict[num]

= index

return

"沒有合適的值"

leetcode第一題直達車

我的個人部落格,有空來坐坐

Leetcode 第一題 兩數之和

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

leetcode第一題 兩數之和

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

LeetCode第一題 兩數之和

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