算法1
暴力枚举
C++ 代码
class Solution {
public:
vector<vector<int> > findContinuousSequence(int sum) {
vector<vector<int>>res;
for(int i = 1; i <= (sum+1)/2; i++){
int _sum= 0;
vector<int> temp;
for(int j = i ; j <= (sum +1)/2; ){
_sum += j;
temp.push_back(j);
if(_sum == sum){
res.push_back(temp);
break;
}else if(_sum > sum){
break;
}else
j++;
}
}
return res;
}
};
算法2
双指针做法优化成O(n);
考虑用两个数start和end分别表示序列的最小值和最大值。首先把start初始化为1, end初始化为2。如果从start到end的序列的和大于s,我们可以从序列中去掉较小的值,也就是增大start的值。如果从start到end的序列的和小于s,我们可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加start到(1+s)/2 为止。
C++ 代码
class Solution {
public:
vector<vector<int> > findContinuousSequence(int sum) {
// vector<int>temp;
vector<vector<int>>res;
//int _sum = 0;
int start = 1, end = 2;
int curSum = 0;
while(start < end && end <= (sum+1)/2){
curSum = (start + end)*(end-start +1)/2;
if(curSum == sum){
vector<int>line;
for(int i = start;i <= end;i++)
line.push_back(i);
res.push_back(line);
end++;
}else if(curSum < sum){
end++;
}else{
start++;
}
}
return res;
}
};