zoukankan      html  css  js  c++  java
  • 【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)
  • 相关阅读:
    跳转指定页面
    如何解决项目中.a文件中的.o冲突
    地图根据起点和终点计算中心点角度来绘制弧线 iOS
    codePush常用
    ios原生push到RN界面后pop
    atomic,nonatomic的区别
    KVC
    jQuery绑定event事件的各种方法比较
    Git常用命令总结
    多个$(document).ready()的执行顺序问题
  • 原文地址:https://www.cnblogs.com/flix/p/13382852.html
Copyright © 2011-2022 走看看