题目
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例1
输入:target = 9
输出:[[2,3,4],[4,5]]
示例2
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
思路
- 滑动窗口的思想。使用两个指针起始指向数字1、2。求区间的和,
- 如果区间的和大于S,则左边的指针加1。
- 如果和小于S,则右边的指针加一。
- 如果该区间的和等于S则找到了序列,找到一个序列后,将左指针加一继续找。
- 求和可以使用等差数列的公式: 。
代码
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int>> ans;
int lo = 1, hi = 2;
while ( lo < hi ) {
int sum = ( hi - lo + 1 ) * ( lo + hi ) >> 1;
if ( sum == target ) {
addSequence( lo, hi, ans );
++lo;
}
else if ( sum > target )
++lo;
else if ( sum < target )
++hi;
}
return ans;
}
void addSequence( int lo, int hi, vector<vector<int>>& ans ) {
vector<int> temp;
while ( lo <= hi )
temp.push_back( lo++ );
ans.push_back( temp );
return;
}
};