滑动窗口法求和为s的连续正数序列

题:输入一个正整数target,输出所有和为target的连续正整数序列(至少包含两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

解决办法:滑动窗口法:(窗口始终向一个方向移动)
序列起始位置为i,终止位置为j(区间为[i,j)):
①当i~j内的序列和小于target时,i不动,j++;
②当i~j内的序列和大于target时,j不动,i++;
③当i~j内的序列和等于target时,保存序列内的值。

class Solution
{
   public:
   vector<vector<int>> findSequence(int target)
   {
      int left=1;//窗口左边界
      int right=1;//窗口右边界
      int sum=0;//序列和
      vector<vector<int>> ans;
      while(left<=target/2)
      {
         if(sum<target)
         {
            sum+=right;//右边界右移
            right++;
         }
         else if(sum>target)
         {
            sum-=left;//左边界右移
            left++;
         }
         else
         {
            vector<int> temp;
            for(int k=i;k!=j;k++)
            {
               temp.push_back(k);
            }
            ans.push_back(temp);
            sum-=i;//左边界右移,寻找下一个符合条件的序列
            i++;
         }
     }
     return ans;
   }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值