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;
    }
};
全部评论

相关推荐

不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务