JZ41 和为S的连续正数序列**

题目描述

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

思路

(讨论中的思想)
滑动窗口思想
假设有一个连续序列,定义一个滑动窗口,通过改变窗口的左右边界来改变窗口里面的值的和(注意一下:**窗口的边界需要有规律地移动,比如从左往右,不能像左移动,否则就乱套了)

  • 初始化左右边界(左:1,右:2)
  • 当窗口中的值的和=目标值时,将窗口里的值存放进临时数组中(窗口中的值的和可以用求和公式来求);存完以后要进行清空临时数组,并且将左窗口右移,以便求下一组满足条件的序列;
  • 当窗口中的值的和>目标值时,左窗口右移;
  • 当窗口中的值的和<目标值时,右窗口左移;
  • 注意一下循环结束条件:当左窗口大于或等于右窗口时结束循环

代码

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<int> seq;
        vector<vector<int>> res;
        int low=1,high=2;//滑动窗口的边界
        int cur;//计算窗口里的总和
        while(low<high)
        {
            cur=(low+high)*(high-low+1)/2;
            if(cur==sum)
            {
                for(int i=low;i<=high;i++)
                    seq.push_back(i);
                res.push_back(seq);
                seq.clear();  //当前序列加入结果中就可以清空了
                low++; //每次都先固定左边界,固定好了之后再去移动右边界
            }
            else if(cur<sum)
                high++;
            else
                low++;
        }
        return res;
    }
};
全部评论

相关推荐

挣K存W养DOG:他真的很中意你,为什么不回他
点赞 评论 收藏
分享
11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务