首页 > 其他分享 >滑动窗口

滑动窗口

时间:2023-11-17 20:55:21浏览次数:70  
标签:窗口 target nums int 复杂度 数组 ans 滑动

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存

符合条件的子数组,返回 0 。

 

示例 :

输入:target = 7, nums = [2,3,1,2,4,3]

输出:2

解释:子数组 [4,3] 是该条件下的长度最小的子数组。

 

1、三层循环:

for (i=0;i<=len-1;i++) #起始位置
       for(j=1;j<=len-1-i+1;j++) #取的长度
             for(k=i;k<=i+j-1;k++) #终止位置

2、两层循环:

for(i=0;i<=len-1;i++){     #起始位置
            ans=0;
            for(j=i;j<=len-1;j++){   #终止位置。相比于三层循环优化在于:累加便可算出起始位置到终止位置的和。无需多一层循环
                ans+=nums[j];
                if(ans>=target){
                    length=min(length,j-i+1);
                }
            }
        }

3、滑动窗口:

我的代码:不太清晰,但写了几次都是这个。当我们的值达到了目标值就开始从起始位置减,重复这个过程。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int len=nums.size();
        int i,j,k;
        int ans=len;
        int ans1=0;
        int sum=0;
        for(j=0;j<=len-1;j++){
            ans1+=nums[j];
        }
        if(ans1<target){
            return 0;
        }
        for(i=0,j=0;j<=len-1;){
            while(sum<target&&j<=len-1){
                
                sum+=nums[j++];
            }
            while(sum>=target){
                ans=min(ans,j-1-i+1);
                sum-=nums[i++];
            }
        }
        return ans;
    }
};

更为标准的代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int len=nums.size();
        int i,j,k;
        int ans=0x3f3f3f3f;
        int ans1=0;
        int sum=0;
        i=0;
        for(j=0;j<=len-1;j++){
            sum+=nums[j];
            while(sum>=target){
                ans=min(ans,j-i+1);
                sum-=nums[i++];
            }
        }
        return ans==0x3f3f3f3f?0:ans;
    }
};

 

时间复杂度:O(n)

空间复杂度:O(1)

为什么时间复杂度是O(n)?

不要以为for里放一个while就以为是O(n^2), 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。

代码随想录真的贴心。

 

标签:窗口,target,nums,int,复杂度,数组,ans,滑动
From: https://www.cnblogs.com/bhd123/p/17839566.html

相关文章

  • C#winform学习4(tab光标顺序、子窗口打开限制、提示框、定时器、状态栏用户时间、下拉
    1.更改光标顺序视图-->Tab键顺序启动的时候,光标就会在用户名的文本框中,并且在按tab键的时候,光标就会按照我们定的顺序显示。即用户名文本框--tab-->密码文本框--tab-->登录--tab-->重置 2.新建类右键-->添加-->类写入代码,封装字段生成属性,右键-->重构-->封装字段-->确认--......
  • 【路径规划】基于动态窗口法DWA算法的机器人动态避障路径规划研究附Matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 第9章 窗口和布局综合应用--编写云对象存储浏览器主界面(综合运用,非常重要!)
    除了每章小结以外,这节课是对前面所学知识点的综合运用,非常重要非常重要看完每一小节再跟着敲窗口和布局综合应用--编写云对象存储浏览器主界面(巩固加深课)很重要!界面最好是手敲,跟敲......
  • 第7章 Qt 窗口--开发云对象存储浏览器的登录窗口
    Qt窗口--开发云对象存储浏览器的登录窗口本章导学学习常用的控件,通过文档使用控件窗口基本知识讲解(代码7-2)生活中的窗口是连接人与外面风景的桥梁,计算机的窗口是连接人和操作系统资源的桥梁,并且更加方便,使用命令行太难了任务栏的应用程序上一般为顶层窗口,顶层窗......
  • 同一用户名,远程连接Windows Server 2019 时,如何禁止打开新窗口
    同一用户名,远程连接WindowsServer2019时,如何禁止打开新窗口答:您好!如果您想在远程连接WindowsServer2019时禁止打开新窗口,您可以尝试以下方法:使用组策略编辑器:打开组策略编辑器,可以通过运行"gpedit.msc"命令来打开。导航到"计算机配置">"管理模板">"Windows组件">"远......
  • JavaScript的BOM和DOM对象操作与设置顶级窗口------前端
    准备一个用来嵌入的HTML页面<!DOCTYPEhtml><!--这是HTML的注释--><htmllang="en"id="myHtml"> <head> <!--这里不是设置了编码,而是告诉浏览器,用什么编码方式打开文件避免乱码--> <metacharset="UTF-8"> <metaname="viewport&q......
  • 下面哪些方式在同一个窗口下能够检测一个js对象是数组类型?
    下面哪些方式在同一个窗口下能够检测一个js对象是数组类型?AArray.isArray()BinstanceofCtypeofDObject.prototype.toString.call()正确答案:ABDA:Array为js的原生对象,它有一个静态方法:Array.isArray(),能判断参数是否为数组B:instanceof运算符返回一个布尔值,表示对象是......
  • xshell终端——多个窗格同步输入——xshell同时控制多个窗口的快捷方式
    参考:https://blog.csdn.net/m0_58347801/article/details/129551382  ========================   突发发现了终端的另类用法,就是多个窗格同步输入的方法,虽然说这个方法平时确实没啥用,但是突然用到了发现还不赖。 发现在配置Hadoop集群的时候这个操作还真不赖。......
  • 窗口函数
    前言见这种近几、连续、每类前几、各个前几直接考虑窗口函数,这里说下常用的几个:窗口函数语法都是一样的:<窗口函数>OVER(partitionby<用于分组的列名>orderby<用于排序的列名>)序号函数:row_number、rank、dense_rank例如:对100,99,99,85,84row_number的进行排序结果是:1、2......
  • 命令文件后台运行即隐藏黑窗口
    win系统下第一种方法:bat后台运行https://www.cnblogs.com/sheng-247/p/10528160.html直接让bat窗口在后台运行,在你的bat脚本最开始加上这三行:if"%1"=="hide"gotoCmdBeginstartmshtavbscript:createobject("wscript.shell").run("""%~0""......