思路:注意题目上说是连续的一串数。判断连续的一串数是否满足一定的性质可以转化为在一个区间内这些数是否满足一定的性质,那么这道题就可以用我们喜闻乐见的滑动区间来做了。
模拟过程:我们可以设一个初始区间,左边界l=1,右边界r=2.
在这个区间内,数字之和就是等差数列求和:sum=(l+r)*(r-l+1)/2
如果sum<target 那么说明这个区间太小了,就让右边界向右移动扩大区间
如果sum>target,那么说明这个区间太大了,就让左边界向右移动缩小区间
如果sum==target,那么说明这个区间正好满足性质,就赋值给目标数组。然后以这个左边界开头的区间已经找过了,所以就让左边界向右移动找下一个解。
代码如下:
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int>>ver;
vector<int>ans;
int sum,l=1,r=2;
for(int l=1,r=2;l<r;)
{
sum=(l+r)*(r-l+1)/2;
if(sum==target)
{
ans.clear();
for(int i=l;i<=r;i++) ans.push_back(i);
ver.push_back(ans);
l++;
}
else if(sum>target) l++;
else r++;
}
return ver;
}
};