题目
找出所有和为S的连续正数序列。
思路
- 思路一
- 两个for循环。从1开始的数字依次作为起始元素,计算连续的和。如果该和等于S,则找到了一个连续序列。
- 复杂度 O ( n 2 ) O(n^2) O(n2)。
- 思路二
- 滑动窗口的思想。使用两个指针起始指向数字1、2。求区间的和,如果该区间的和等于S则找到了序列。如果区间的和大于S,则左边的指针加1,如果和小于S,则右边的指针加一。
- 求和可以使用等差数列的公式: ( a 0 + a n ) n 2 \frac{(a_0+a_n)n}{2} 2(a0+an)n 。
代码1
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int> > res;
for ( int i = 1; i < sum/2 + 1; ++i ) {
int tempSum = sum;
vector<int> tempVec;
for ( int j = i; j <= sum/2 + 1; ++j ) {
tempSum -= j;
tempVec.push_back( j );
if ( tempSum < 0 )
break;
if ( tempSum == 0 )
res.push_back( tempVec );
}
}
return res;
}
};
代码2
// 滑动窗口
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int> > res;
int left = 1, right = 2;
while ( left < right ) {
int tempSum = (left+right)*(right-left+1)/2;
if ( tempSum == sum ) {
fillResult( res, left, right);
++left;
}
else if ( tempSum < sum )
++right;
else if ( tempSum > sum )
++left;
}
return res;
}
void fillResult( vector<vector<int> >& res, int& left, int& right ) {
vector<int> temp;
for ( int i = left; i <= right; ++i )
temp.push_back( i );
res.push_back( temp );
return;
}
};