0
点赞
收藏
分享

微信扫一扫

和为s的连续正数序列


和为s的连续正数序列_双端队列

参考链接:​​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;

}
};

 

举报

相关推荐

0 条评论