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

news/2024/5/20 8:06:15 标签: 算法, 数据结构, 数组, 滑动窗口, 力扣, 面试, 考研

文章目录

  • 前言
  • 一、题目
    • 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;
    }
};

三、知识风暴


http://www.niftyadmin.cn/n/5073573.html

相关文章

Ubuntu系统安装gtest

1.下载Google test 源码 git clone https://github.com/google/googletest.git 2.进入googletest目录,并创建build目录并进入 cd googletestmkdir buildcd build 3.cmake编译 cmake .. 注意:如果没有提前安装cmake,g工具需提前安装 sudo apt-get install cmake sudo ap…

一文带你了解三大开源关系型数据库:SQLite、MySQL和PostgreSQL

目录 1、概述 2、SQLite数据库 2.1、SQLite简介 2.2、SQLite优缺点 2.3、SQLite应用场景 3、MySQL数据库 3.1、MySQL简介 3.2、MySQL优缺点 3.3、MySQL应用场景 4、PostgreSQL数据库 4.1、PostgreSQL简介 4.2、PostgreSQL优势 4.3、PostgreSQL应用场景 5、在实际…

Mybatis多表操作

1.多表操作概述 多表模型分类 一对一&#xff1a;在任意一方建立外键&#xff0c;关联对方的主键 一对多&#xff1a;在多的一方建立外键&#xff0c;关联一的一方的主键 多对多&#xff1a;借助中间表&#xff0c;中间表至少两个字段&#xff0c;分别关联两张表的主键 2.…

MySQL:主从复制-基础复制(6)

环境 主服务器 192.168.254.1 从服务器&#xff08;1&#xff09;192.168.254.2 从服务器&#xff08;2&#xff09;192.168.253.3 我在主服务器上执行的操作会同步至从服务器 主服务器 yum -y install ntp 我们去配置ntp是需要让从服务器和我们主服务器时间同步 sed -i /…

Windows编写批处理文件.bat启动n个java服务

批处理语法参考学习&#xff1a;https://blog.csdn.net/wuhenyouyuyouyu/article/details/120736519 ECHO OFFecho "准备杀死hntc-qyjy相关进程" timeout /t 2 /nobreak >nulset charhntc-qyjyecho char : %char%for /f "usebackq tokens1-2" %%a in (j…

【数组】二分查找(减不减一,看初始化!)

一、力扣习题链接 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 二、思路 这道题目的前提是数组为有序数组&#xff0c;同时题目还强调数组中无重复元素&#xff0c;因为一旦有重复元素&#xff0c;使用二分查找法返回的元素下标可能不是唯一的&#xff0c;这些都是…

论文写作系列1:如何回复中文审稿意见

一、基本格式 &#xff08;一&#xff09;文档&#xff1a;名称修改说明 在英文中&#xff0c;我们叫response letter&#xff0c;而在中文中叫修改说明 &#xff08;二&#xff09;结构 1、首先向编辑、评审人表示感谢 2、总体说明文中各种颜色、字体所代表含义 3、逐一陈…

lua学习笔记

单行注释&#xff1a; 多行注释&#xff1a; 命名&#xff1a; Lua不支持下划线大写字母&#xff0c;比如&#xff1a;_ABC 但支持&#xff1a;_abc 关键字&#xff1a; 全局变量&#xff1a; 直接变量名 内容就是全局 局部变量&#xff1a; 加上local即可 nil&#xff1…