面試題57 II 和為s的連續正數序列

2021-10-12 19:55:26 字數 1631 閱讀 3795

題目:輸入乙個正整數 target ,輸出所有和為 target 的連續正整數序列(至少含有兩個數)。序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。

注意:題目要求的是連續的數字

方法一:暴力+列舉

第一層遍歷,固定 i 的位置,第二層遍歷從 i 的位置開始,乙個乙個加起來,當和 sum 的值位 target 的時候,加入到結果集中。結果集先定義為 list 型別,最後在轉換成陣列

public

int[

]findcontinuoussequence

(int target)

else

if(sum == target)

res.

add(nums)

; sum =0;

break;}

}}return res.

toarray

(new

int[res.

size()

]);}

方法二:暴力+數學優化

由於是連續的數字,我們知道了首尾 i 和 j 就可以直接套公式 (i + j)(j - i + 1) / 2 = target,可以直接用求根公式反解出 j ,時間開銷是 o(1),在方法一的基礎上稍微改進就行

public

int[

]findcontinuoussequence

(int target)

int delta_sqrt =

(int

)math.

sqrt

(delta +

0.5)

;// 這個 0.5 必不可少

if(delta_sqrt %2==

1&&(long

) delta_sqrt * delta_sqrt == delta)

res.

add(nums);}

}}return res.

toarray

(new

int[res.

size()

]);}

方法三:雙指標法

定義兩個指標,指標 i 在指標 j 的左邊,初始化 i = 1, j = 2。知道了連續數的邊界,我們可以直接套公式計算 sum = (i + j)(j - i + 1) / 2 ,如果 sum == target, 那麼存入結果集;如果 sum < target,j++;如果 sum > target,i++。迴圈終止的條件是,i > j,因為當 j 遍歷到後面的時候,求出來的 sum 都是大於 target 的,所以 i 一定會超過 j

public

int[

]findcontinuoussequence

(int target)

res.

add(nums)

; i++;}

else

if(sum < target)

else

}return res.

toarray

(new

int[res.

size()

]);}

面試題57 II 和為s的連續正數序列

leetcode 面試題57 ii.和為s的連續正數序列 輸入乙個正整數 target 輸出所有和為 target 的連續正整數序列 至少含有兩個數 序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。leetcode 面試題57 ii.和為s的連續正數序列 官方題解 列舉 暴力 列舉 數學...

面試題 和為s的連續正數序列

輸入乙個正數s,列印出所有和為s的連續正數序列 至少含有兩個數 例如,輸入15,由於1 2 3 4 5 4 5 6 7 8 15,所以列印出3個連續序列1 5 4 6和7 8。思路 依舊雙指標套路 void findcontinuoussequence int sum if sum 3 return...

57 和為S的連續正數序列

小明很喜歡數學,有一天他在做數學作業時,要求計算出9 16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100 至少包括兩個數 沒多久,他就得到另一組連續正數和為100的序列 18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和...