参考链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/solution/shi-yao-shi-hua-dong-chuang-kou-yi-ji-ru-he-yong-h/
滑动窗口
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
//滑动窗口,L为左边界,R为右边界[L,R]
//L、R 只会往右滑动,
vector<vector<int>>res;
//题意可知从大于等于1开始
int L=1,R=1;
int sum=L;
//因为是连续的正数序列,L最多到target/2 ,因为至少含有两个数,超过target/2 ,则必然会大于target
while(L<= target/2)
{
if(sum==target)//L往右滑动
{
vector<int>tmp;
for(int i=L;i<=R;i++)
tmp.push_back(i);
res.push_back(tmp);
//找到值之后也需要维护
sum-=L;
L++;
}
else if(sum<target)//R往右滑动,
{
R++;
sum+=R;
}
else if(sum>target)//L往右滑动,
{
sum-=L;
L++;
}
}
return res;
}
};
滑动窗口+双端队列
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
//滑动窗口,L为左边界,R为右边界[L,R]
//L、R 只会往右滑动,
vector<vector<int>>res;
//双端队列维护此时的滑动窗口
deque<int>record;
//题意可知从大于等于1开始
int L=1,R=1;
int sum=L;
record.push_back(L);
//因为是连续的正数序列,L最多到target/2 ,因为至少含有两个数,超过target/2 ,则必然会大于target
while(L<= target/2)
{
if(sum==target)//L往右滑动
{
vector<int>tmp(record.begin(),record.end());
res.push_back(tmp);
//找到值之后也需要维护
sum-=L;
L++;
record.pop_front();
}
else if(sum<target)//R往右滑动,
{
R++;
record.push_back(R);
sum+=R;
}
else if(sum>target)//L往右滑动,
{
sum-=L;
record.pop_front();
L++;
}
}
return res;
}
};