劍指offer 面試題57 和為s的數字

2021-10-09 09:52:28 字數 2436 閱讀 2862

?每日一句: 「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。

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

時間複雜度: $ o(n^2)$

leetcode提交超時:26 / 36個通過測試用例

雜湊表

上面的**用了兩成迴圈,其實轉化一下思想,能不能只用乙個for迴圈呢?

方法:twosum那道題

作為一pythoner,怎麼會輕言放棄,辦法是一定的。list不好使,那我們還有set呢。也就是雜湊表法:利用一次遍歷,先找乙個數,然後依次遍歷檢視target-i是否在這個set中,如果在,即返回。

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)$,只使用了一次for遍歷陣列

空間複雜度: $ 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 ...