給定乙個整數陣列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. pythondef
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...