我是靠谱客的博主 狂野猎豹,最近开发中收集的这篇文章主要介绍LeetCode-面试题57 - II. 和为s的连续正数序列,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

 

示例 1:

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

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

限制:

1 <= target <= 10^5

 

滑动窗口:

注意至少两个数,所以序列最左边最大为(target+1)/2,窗口范围和表示为cursum

如果cursum 小于 target ,  序列右边加一个数,end++, cursum+=end

如果cursum 大于 target ,  序列左边减一个数,cursum-=start,start+1

 

#include <iostream>
#include <vector>
using namespace std;


class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        if (target < 3) {
            return res;
        }

        int start = 1;
        int end = 2;
        int middle = (target + 1) / 2;
        int cursum = start + end;
        while (start<middle) {
            if (cursum == target) {
                getson(start, end);
            }

            while (cursum >target && start < middle) {
                cursum -= start;
                start++;
                if (cursum == target) {
                    getson(start, end);
                }
            }

            end++;
            cursum += end;
        }
        return res;
    }


    void getson(int start, int end) {
        vec.clear();
        for (int i = start; i <= end; i++) {
            vec.push_back(i);
        }
        res.push_back(vec);
    }

private:
    vector<int> vec;
    vector<vector<int>> res;
};


int main() {

    Solution* ps = new Solution();
    vector<vector<int>> res = ps->findContinuousSequence(9);


    for (int i = 0; i < res.size(); i++) {
        for (int j = 0; j < res[i].size(); j++) {
            cout << res[i][j];
        }
        cout << endl;
    }
    return 0;

}

 

最后

以上就是狂野猎豹为你收集整理的LeetCode-面试题57 - II. 和为s的连续正数序列的全部内容,希望文章能够帮你解决LeetCode-面试题57 - II. 和为s的连续正数序列所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部