題目
【輸出所有和爲S的連續正數序列(至少含有兩個數)。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序】
1、分析
由於數是連續的正數,且至少爲兩個數,所以最小的組合爲 [ 1 , 2 ],和最小爲3。可以使用兩個數 small 和 big 分別表示序列的最小值和最大值。首先把small 初始化爲1,big初始化爲2。如果從small到big的序列和大於s ,則可以從序列中去掉較小的值,即small++。如果從small到big 的序列和小於s,則可以增大 big,從而讓序列包含更多的數字。因爲這個序列至少有兩個數字,而序列的和爲 s,則small 應該小於 (1 + s)/2。
2、代碼
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int> > res;
if(sum<3)
return res;
int small=1, big=2 ;
int mid=(1+sum)/2;
while(small<mid)
{
int curSum=(small+big)*(big-small+1)/2;
if(curSum==sum)
{
vector<int> temp;
for(int i=small;i<=big;++i)
temp.push_back(i);
res.push_back(temp);
small++;
}
if(curSum>sum)
++small;
if(curSum<sum)
++big;
}
return res;
}
};