【代码随想录】LC 209. 长度最小的子数组

news2024/11/27 7:43:00

文章目录

  • 前言
  • 一、题目
    • 1、原题链接
    • 2、题目描述
  • 二、解题报告
    • 1、思路分析
    • 2、时间复杂度
    • 3、代码详解
  • 三、知识风暴

前言

本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记,如有侵权,立即删除。

一、题目

1、原题链接

209. 长度最小的子数组

2、题目描述

在这里插入图片描述
在这里插入图片描述

二、解题报告

1、思路分析

  1. 暴力解法
    利用两层循环,第一层循环枚举子数组的起点位置,第二层循环枚举子数组的终点位置,第二层循环中可以同时来统计当前子数组的和,如果符合题目条件则更新length,否则继续循环,直至两层循环结束,返回题目要求的值,算法结束。
  2. 滑动窗口
    利用两个指针,i指向窗口起始位置j指向窗口的终止位置。初始时ij均指向数组中第一个元素,指针j不断向后遍历,当区间[i,j]中数组元素和大于等于target 时(只要满足这个条件就执行后面操作,即为while循环),根据当前子数组的长度来确定是否更新length向后移动i指针(原因:因为区间[i,j]中的元素和已经大于等于target,如果此时i指针不动,j指针继续向后遍历,之后的区间一定满足元素和大于等于target,但是数组长度一定不比当前[i,j]区间的长度短,即此时i指针不动,j向后遍历到的各个位置与i组成的区间[i,j]一定不是答案,所以此时已经没有必要让i再待在当前位置了,故需要移动i到下一个位置),直至j遍历完所有位置,返回题目要求的值,算法结束。

2、时间复杂度

暴力解法时间复杂度O(n^2)
滑动窗口时间复杂度O(n)

3、代码详解

暴力解法代码(TLE、力扣无法AC)

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        //将长度初始化为整型最大值
        int length = INT_MAX;
        for (int i = 0; i < nums.size(); i++) {
            int sum = 0;
            for (int j = i; j < nums.size(); j++) {
                sum += nums[j];
                //j-i+1表示当前满足条件的数组长度
                if (sum >= target && j - i + 1 < length) {
                    length = j - i + 1;
                }
            }
        }
        //如果length没有被更新说明不存在符合条件的子数组
        return length == INT_MAX ? 0 : length;
    }
};

滑动窗口代码

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int length = INT_MAX;
        //nowLength记录当前符合条件的子数组长度
        int nowLength = 0;
        //sum记录当前子数组的元素之和
        int sum = 0;
        int i = 0;
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            while (sum >= target) {
                nowLength = j - i + 1;
                length = length > nowLength ? nowLength : length;
                //窗口缩小:因为当前[i,j]之间已经是最优答案,没有再以i开头的区间比当前结果更优
                sum -= nums[i++];
            }
        }
        return length == INT_MAX ? 0 : length;
    }
};

三、知识风暴

  • INT_MAXINT32_MAX表示整型的最大值
  • 滑动窗口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1070403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库配置mysql5.7

1 创建数据库 """ 1.管理员连接数据库 mysql -uroot -proot2.创建数据库 create database hello default charsetutf8;3.查看用户 select user,host,password from mysql.user;# 5.7往后的版本 select user,host,authentication_string from mysql.user; "…

云原生开发:构建弹性应用的最新策略

文章目录 云原生开发概述策略一&#xff1a;容器化策略二&#xff1a;微服务架构策略三&#xff1a;自动化策略四&#xff1a;监控和日志记录总结 &#x1f389;欢迎来到云计算技术应用专栏~云原生开发&#xff1a;构建弹性应用的最新策略 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&…

初级软件测试工程师如何涨薪?

测试进阶方向 说到功能测试进阶方向&#xff0c;这是每个测试从业者都会经历的一个阶段。 个人把测试进阶分为两大类&#xff1a;业务测试 和 技术测试 业务测试&#xff1a; 顾名思义就是对当前从事的业务知识非常熟习&#xff0c;了解产品的显示、隐示需求&#xff0c;测…

Web1.0——Web2.0时代——Web3.0

Web1.0 Web1.0是互联网的早期阶段&#xff0c;也被称为个人电脑时代的互联网。在这个阶段&#xff0c;用户主要通过web浏览器从门户网站单向获取内容&#xff0c;进行浏览和搜索等操作。在这个时代&#xff0c;技术创新主导模式、基于点击流量的盈利共通点、门户合流、明晰的主…

基于springboot实现人职匹配推荐管理系统演示【项目源码+论文说明】分享

基于springboot实现人职匹配推荐管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于人职匹配推荐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了…

Linux友人帐之进程管理

一、基本概念 1、在Liux中&#xff0c;每一个程序都是有自己的一个进程&#xff0c;每一个进程都有一个id号&#xff01; 2、每一个进程呢&#xff0c;都会有一个父进程&#xff01; 3、进程可以有两种存在方式&#xff1a;前台&#xff01;后台运行&#xff01; 4、一般的话服…

企业AI工程化之路:如何实现高效、低成本、高质量的落地?

MLOps工程实践 概述面临挑战目的内容简介读者对象专家推荐目录 写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 概述 作为计算机科学的一个重要领域&#xff0c;机器学习也是目前人工智能领域非常活跃的分支之一。机器学习通过分析海量数据、总结规律&#x…

【数据结构】二叉树--顺序结构及实现 (堆)

目录 一 二叉树的顺序结构 二 堆的概念及结构 三 堆的实现 1 包含所有接口 (Heap.h) 2 初始化,销毁和交换&#xff08;Heap.c) 3 向上调整&#xff08;Heap.c) 4 插入&#xff08;Heap.c) ​5 向下调整&#xff08;Heap.c) 6 删除&#xff08;Heap.c) ​7 打印&#…

从零开始:sshd配置与远程登录的快速入门

1.sshd服务介绍 在服务端安装openssh服务 /etc/ssh/sshd_conf # sshd服务的配置文件 端口22 本服务启动后自动生成密钥存储文件 2.ssh参数 2.1.远程登陆 #常用参数 -l #指定登陆用户 -i #指定私钥 -X #开启图形 -f #后台运行 -o #指定连接参数 -t #指定连接跳板ssh userre…

比 N 小的最大质数

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

【进阶C语言】数组笔试题解析

本节内容以刷题为主&#xff0c;大致目录&#xff1a; 1.一维数组 2.字符数组 3.二维数组 学完后&#xff0c;你将对数组有了更全面的认识 在刷关于数组的题目前&#xff0c;我们先认识一下数组名&#xff1a; 数组名的意义&#xff1a;表示数组首元素的地址 但是有两个例外…

Kafka 简介之(学习之路)

正文 一、简介 1.1 概述 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于zookeeper协调的分布式日志系统&#xff08;也可以当做MQ系统&#xff09;&#xff0c;常见可以用于web/nginx日志、访问日志&#xff0c;消息服务…

挑选适合您的优秀项目管理软件

哪个项目管理软件好用&#xff0c;这全得看用户需求。有的企业项目组比较多&#xff0c;项目比较大&#xff0c;就需要重一些的软件。有的企业就是简单管理一下项目进展&#xff0c;看看工时&#xff0c;那轻量级项目管理软件就挺好用&#xff0c;因为上手很快。还有的初创小团…

《软件方法》第1章2023版连载(04)不了解ABCD工作流的危害

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.2 建模工作流 1.2.4 不了解ABCD的危害 1.2.4.1 思维颠倒 如果软件开发人员对以上的“A-业务建模”、“B-需求”、“C-分析”、“D-设计”工作流没有概念&#xff0c;就会把软件开…

vulnhub_Empire_LupinOne靶机渗透测试

Empire_LupinOne靶机 靶机地址&#xff1a;Empire: LupinOne ~ VulnHub 文章目录 Empire_LupinOne靶机信息收集web渗透获取权限横向移动权限提升靶机总结 信息收集 通过nmap扫描得到靶机开放22和80端口&#xff0c;进行全扫描得到了一些服务版本信息等&#xff0c;web端有ro…

GitHub基础

1、仓库是什么意思&#xff1f;仓库拥有者是谁&#xff1f; 在软件开发或版本控制系统中&#xff0c;"仓库"&#xff08;Repository&#xff09;是指存储项目代码、配置文件、文档等相关文件的地方。它可以看作是一个中央存储库&#xff0c;用于管理和跟踪项目的各个…

v-bind绑定

一、标签属性动态绑定 方式一&#xff1a; v-bind:属性名"data声明的变量名" 方式二&#xff1a;&#xff08;简写&#xff09; 将v-bind省略&#xff0c;直接 :属性名"data声明的变量" v-bind.属性名[.修饰符]"变量名、计算属性。。 对应还提供了修饰…

【Docker】简易版harbor部署

文章目录 依赖于docker-compose下载添加执行权限测试 安装harbor下载解压修改配置文件部署配置开机自启动登录验证 使用harbor登录打标签上传下载 常见问题 依赖于docker-compose 下载 curl -L “https://github.com/docker/compose/releases/download/2.22.0/docker-compose-…

第八章 排序 十三、置换-选择排序

目录 一、概括 二、例子 ​三、考点 一、概括 置换-选择排序是一种排序算法&#xff0c;它通过在未排序的元素中选择最小的元素并将其放置在已排序的部分的末尾来逐步将列表排序。具体过程如下&#xff1a; 从列表中选择最小的元素&#xff0c;并将其与列表中第一个元素交…

一文看懂光模块的工作原理

你们好&#xff0c;我的网工朋友 光模块有很多类别&#xff0c;是我们经常要用到的PHY层器件。虽然封装&#xff0c;速率&#xff0c;传输距离有所不同&#xff0c;但是其内部组成基本是一致的。 以太网交换机常用的光模块有SFP&#xff0c;GBIC&#xff0c;XFP&#xff0c;X…