?每日一句: 「we hold ourselves back in ways both big and small, by lacking self-confidence, by not raising our hands, and by pulling back when we should be leaning in.」 — sheryl sandberg輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,則輸出任意一對即可。
示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[2,7] 或者 [7,2]
示例 2:
輸入:nums = [10,26,30,31,47,60], target = 40
輸出:[10,30] 或者 [30,10]
限制:
暴力法1
<= nums.length <=10^
51<= nums[i]
<=10^
6
首先選擇陣列乙個數字,從剩下的n-1個數字找兩數之和是不是等於s。
時間複雜度: $ o(n^2)$def
twosum
(self, nums: list[
int]
, target:
int)
-> list[
int]
:for i in
range
(len
(nums)):
for j in
range
(i +1,
len(nums)):
if nums[i]
+ nums[j]
== target:
return nums[i]
, nums[j]
return
leetcode提交超時:26 / 36個通過測試用例雜湊表
上面的**用了兩成迴圈,其實轉化一下思想,能不能只用乙個for迴圈呢?
方法:twosum那道題作為一pythoner,怎麼會輕言放棄,辦法是一定的。list不好使,那我們還有set呢。也就是雜湊表法:利用一次遍歷,先找乙個數,然後依次遍歷檢視target-i是否在這個set中,如果在,即返回。
時間複雜度: $ o(n)$,只使用了一次for遍歷陣列class
solution
:def
twosum
(self, nums: list[
int]
, target:
int)
-> list[
int]
: li_set =
set(nums)
for i in li_set:
if(target - i)
in li_set:
return i, target - i
return
空間複雜度: $ o(n) $,此方法利用了乙個set
雙指標
做出了上面的方法後,發現其實雜湊表法並沒有利用題目中給出遞增排序陣列的特點。利用遞增的特點找到空間複雜度o(1)的解題方法–雙指標對撞:
演算法流程可以檢視此題解取兩端
別忘了二分查詢啊class
solution
:def
twosum
(self, nums: list[
int]
, target:
int)
-> list[
int]
: rpointer, lpointer =0,
len(nums)-1
while rpointer < lpointer:
twosum = nums[rpointer]
+ nums[lpointer]
if twosum == target:
return nums[rpointer]
, nums[lpointer]
elif twosum > target:
lpointer -=
1else
: rpointer +=
1return
「遞增+有序」,難道二分查詢不配有名字嗎?
劍指offer 面試題 57 和為 S 的數字
輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。對應每個測試案例,輸出兩個數,小的先輸出。時間限制 1秒 空間限制 32768k 熱度指數 62731 思路 要找兩個數的和為s,並不難,但是如果存在多個符合這樣要求的數,...
劍指offer 面試題57 和為s的數字
輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。解決 public arraylistfindnumberswithsum int array,int sum else if array left array right...
劍指Offer 面試題57 和為 s 的數字
題目 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。題目 輸入乙個正數s,列印出所有和為s的連續正數序列 至少含有兩個數 例如輸入15,由於1 2 3 4 5 4 5 6 7 8 15,所以結果列印出3個連續序列1 5 4 ...