《劍指offer》之和為S的連續正數序列

2021-10-03 01:15:08 字數 1590 閱讀 2497

今天刷的一道題目是是關於窮舉的。

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

輸出描述:

輸出所有和為s的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序

這裡參考了答案區的思路,這個思路算是很厲害的,視窗的雙指標的思路。視窗的左右兩邊就是兩個指標,我們根據視窗內值之和來確定視窗的位置和寬度。

以sum=15為例吧,

初始left=1;right=2;和add=1+2=3;

addsum,所以left++,

此時left=3,add=3+4+5+6=18;

add>sum,所以left++,

此時left=4,add=4+5+6=15;

add=sum ,將這組記錄下來,繼續left++;

此時left=5,rigt=6;add=5+6=11;

addsum,所以left++,

此時left=6,rigt=7;add=6+7=14;

addsum,所以left++,

此時left=7,rigt=8;add=7+8=21;

add=sum ,將這組記錄下來,繼續left++;

此時left=8,rigt=8;left>=right,迴圈結束退出,這時我們就可以得到三組滿足條件的序列啦。

通過上面的例子,思路算是非常清楚了,主要是左右兩個指標,當left這個求和很好算吧,等差數列就和

add=(a1+an)*n/2

a1=left;

an=right;

n=right-left+1;

代替上去就可以了。

然後就比較add 與sum 的大小,如果add< sum ,則右指標right右移一位,如果add>sum,則左指標右移一位,如果add=sum,就表明該組是我們想要的,記錄下來,同時l左指標右移一位,繼續查詢其他。

當left>=right的時候就退出迴圈體。

public arraylist> findcontinuoussequence(int sum) 

lists.add(list);

left++;

}else if(addmain 方法

再測乙個100的

劍指offer 之 和為S的連續正數序列

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

劍指offer之和為S的連續正數序列

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

劍指Offer之和為S的連續正數序列

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