和為s的連續整數序列

2021-10-11 09:29:39 字數 2059 閱讀 3408

示例 1:

輸入:target = 9

輸出:[[2,3,4],[4,5]]

示例 2:

輸入:target = 15

輸出:[[1,2,3,4,5],[4,5,6],[7,8]]

2.1  思路分析根據需求,我們要找乙個連續的正整數序列,其和為target,那麼我們可以在1 ~ target中找,即target = 9時,我們就在 1 2 3 4 5 6 7 8 9中尋找;

因為題目要求序列長度至少為2,我們設定兩個變數來控制這個序列的邊界,令 i 指向序列的左邊界,j 指向序列的右邊界,如上例所示,當 i 指向4,就是左邊界的最大值,j 指向的右邊界的最大值 = i 指向左邊界的最大值 + 1;

故左邊界的上界為 (target - 1) / 2,右邊界的上界為 (target + 1) / 2;

暴力法的思路就是在邊界範圍內,求出每乙個連續正整數序列的和,使用 sum 來記錄和,邊求和邊判斷,①若 sum > target,說明當前以某位數為起點的連續整數和不符合要求,直接break,移動到該位數的下一位,比如移動到示例中 3 4 5 ,此時 sum = 12,直接退出進行下一輪,更新左邊界為 4,②若 sum < target,j++,繼續累加,③ 若sum == target,將當前的 [i,j ] 加入到陣列中。退出迴圈,將陣列加入到list中;

2.2  **實現

class solution  else if(sum < target)  else 

list.add(res);

break;}}

}return list.toarray(new int[list.size()]);}}

2.3  複雜度分析3.1  思路分析

我們使用兩個變數 lf ,rt 來來表示區間和sum的左右邊界,因為是乙個間隔為 1 的等差序列,故根據求和公式可得:

初始化lf = 1,rt = 2,當sum < target時,rt++,當sum > target時,lf++,當sum == target時,將區間內的資料儲存到新陣列中,並加入集合,當lf >= rt時,說明此時sum 會一直大於target,因此終止;

該方法是對暴力法的優化,暴力法從每乙個起點開始累加,然後判斷,該方法使得區間的資訊可以復用,比如 [ lf,rt ] 之間的sum==target時,那麼下個區間 [ lf+1,rt ]就必然小於 target,暴力法會重新累加,而在這裡會從 rt+1開始,即累加 [ lf+1,rt+1 ];

3.2  **實現

class solution  else if(sum > target)  else 

list.add(k);

lf++;}}

return list.toarray(new int[list.size()]);}}

3.3  複雜度分析4.1  思路分析

上一種方法用利用的是等差序列公式,若題目給定的只是乙個遞增序列,則需重新考慮解決辦法;

為了方便計算,我們選擇滑動視窗的邊界為前閉後開的方式,變數 i 指向左邊界,變數 j 指向右邊界,當sum < target時,擴大視窗範圍,即更新sum,並j++,當sum < target時,縮小視窗範圍,即更新sum,並i++,當sum == target時,儲存 [ i , j )的元素到陣列,並加入集合,然後更新sum,並i++;

4.2  **實現

class solution  else if(sum > target)  else 

list.add(res);

sum -= i;

i++;}}

return list.toarray(new int[list.size()]);}}

4.3  複雜度分析

劍指offer 和為s的連續整數序列

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

劍指41和為s的連續整數序列

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

和為S的連續正數序列

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