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

2021-08-21 16:41:45 字數 1154 閱讀 1100

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

/**

* 思路1:針對序列起始數字。

* 從start=1開始迴圈,假設序列的起始數字為start,那麼用s逐漸減去start,start+1,star+2....

* 最後s會為0。若s最後為0,則說明以該start開始的序列是和為s的連續序列;若最後s小於0,則

* start+1,再按上述步驟繼續下去。 時間複雜度較高

* */

public arraylist> findcontinuoussequence1(int sum)

if (temp==0)

lists.add(list);}}

return lists;

}/**

* 思路2:針對序列長度

* 假設序列長度為n。由於序列是公差為1的等差數列,所以s=n(n+1)/2.從而n< √2s

* 若n為奇數,則序列中間數就是整個序列的平均值,有 (n & 1) == 1 && sum % n == 0;

* 如果n為偶數,則序列中間兩個數的平均值是序列的平均值,有(sum % n) * 2 == n.

* */

public arraylist> findcontinuoussequence2(int sum)

ans.add(list);}}

return ans;

}/**

* 思路3:定義兩個指標 low、high,分別指向序列的起始和終止

* 初始:low=1,high=2

* 迴圈:利用等差數列的性質: s=(low+high)*(high-low+1)/2 比較sum和s的值

* 當 lowsum,則增大low

* 如果s=sum,則將low與high之間(包括low和high)的數插入list中,然後low增大

*

* */

public arraylist> findcontinuoussequence3(int sum)

lists.add(list);

low++;

} else if (temp}

return lists;

}

劍指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 的連續正數序列

輸入乙個正數 s,列印出所有和為 s 的連續正數序列 至少兩個數 例如輸入 15,由於 1 2 3 4 5 4 5 6 7 8 15,所以結果打出 3 個連續序列 1 5 4 6 和 7 8。考慮用兩個數 small 和 big 分別表示序列的最小值和最大值。首先把 small 初始化為 1,big...