剑指offer——和为s的连续正整数序列

Posted joker1937

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer——和为s的连续正整数序列相关的知识,希望对你有一定的参考价值。

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

示例 1:

输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:

输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]

思路:此类带有“连续序列”字眼的题,一般操作是滑动窗口法。先设置一个大小为0的窗口,left=1, right=1, 窗口内的数字之和为sum,通过比较sum和target,不断扩大有边界或缩小左边界。

class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        //滑动窗口左右边界
        int left = 1, right = 1;
        int sum = 0;
        vector<vector<int>> res;
        while(left <= target / 2) {    //超过target一半后不可能存在连续两个数之和为target
            if(sum < target) {      //sum < target则继续扩展右边界
                sum += right;
                right++;
            }
            else if(sum > target) {  //sum > target则缩小左边界
                sum -= left;
                left++;
            }
            else {            //找到了一个满足条件的序列
                //记录结果
                vector<int> vec;
                //左开右闭的区间
                for(int i = left; i < right; ++i) {
                    vec.push_back(i);
                }
                res.push_back(vec);
                //左边界向右移动一格
                sum -= left;
                left++;
            }
        }
        return res;
    }
};

 

以上是关于剑指offer——和为s的连续正整数序列的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]剑指 Offer 57 - II. 和为s的连续正数序列

剑指offer 和为s的连续整数序列

和为S的连续正整数序列

《剑指offer》:[41-1]和为S的连续整数序列

剑指offer-面试题57_2-和为s的连续正数序列-穷举法

剑指offer-和为S的连续正数序列