題目:輸入乙個正整數 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。現在把問題交給你,你能不能也很快的找出所有和...