• 【LeetCode-滑动窗口】和为s的连续正数序列


    题目描述

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

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

    示例:

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

    说明:

    • 1 <= target <= 10^5

    题目链接: https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/

    思路

    使用滑动窗口来做。初始化 left = 1,right = 2;

    • 如果 right<target,循环:
      • 计算 sum = left + right;
      • 如果 sum==target,则将 [left, right] 范围内的数字放入答案中,并将 right 右移一位,也就是 right++,然后 sum+=right(不这样会死循环)
      • 否则,如果 sum>target,则将窗口左边缩小一位,也就是 sum-=left, left++(这两步的顺序不能错);
      • 否则,如果 sum<target,则将窗口右边扩大一位,也就是 right++, sum+=right(这两步的顺序不能错);

    代码如下:

    class Solution {
    public:
        vector<vector<int>> findContinuousSequence(int target) {
            vector<vector<int>> ans;
            if(target==1){
                ans.push_back({1});
                return ans;
            }
    
            int left = 1;
            int right = 2;
            int sum = left + right;
            while(right<target){
                if(sum==target){
                    vector<int> temp;
                    for(int i=left; i<=right; i++) temp.push_back(i);
                    ans.push_back(temp);
                    right++; // 注意要将 right 右移一位,并 sum+=right
                    sum += right;
                }else if(sum>target){
                    sum -= left;
                    left++;
                }else if(sum<target){
                    right++;
                    sum += right;
                }
            }
            return ans;
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(1)
  • 相关阅读:
    vue 组件的简单使用01
    vue 绑定 class 和 内联样式(style)
    input select 值得绑定与获取
    computed 计算属性
    v-for 循环 绑定对象 和数组
    过滤器 filter
    v-model 双向数据绑定以及修饰符
    v-on 绑定单个或多个事件
    v-bin:href 绑定链接
    .net core自动发送后台请求写法
  • 原文地址:https://www.cnblogs.com/flix/p/13382852.html
Copyright © 2020-2023  润新知