【代码随想录-Leetcode第六题:209. 长度最小的子数组】

news/2024/5/20 8:06:14 标签: leetcode, 算法, 数据结构, 滑动窗口, 考研

209. 长度最小的子数组

  • 题目
  • 思路
  • 代码实现

题目

给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

参考【代码随想录】

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105

思路

滑动窗口
接下来就开始介绍数组操作中另一个重要的方法:滑动窗口

所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。

首先要思考 如果用一个for循环,那么应该表示 滑动窗口的起始位置,还是终止位置。

如果只用一个for循环来表示 滑动窗口的起始位置,那么如何遍历剩下的终止位置?

所以 只用一个for循环,那么这个循环的索引,一定是表示 滑动窗口的终止位置。

那么问题来了, 滑动窗口的起始位置如何移动呢?

这里还是以题目中的示例来举例,s=7, 数组是 2,3,1,2,4,3,来看一下查找的过程:

在这里插入图片描述
最后找到 4,3 是最短距离。

其实从动画中可以发现滑动窗口也可以理解为双指针法的一种!只不过这种解法更像是一个窗口的移动,所以叫做滑动窗口更适合一些。

在本题中实现滑动窗口,主要确定如下三点:

窗口内是什么?
如何移动窗口的起始位置?
如何移动窗口的结束位置?
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

代码实现

//@i want to舞动乾坤 2023/08/13
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int i=0;
        int result =INT32_MAX; //结果,要取得尽量大一点
        int sum=0;//定义累加和
        int sublength=0;
        for(int j=0;j<nums.size();j++){
            sum+=nums[j];
           while(sum>=target)//如果满足
            {
               sublength=j-i+1;//计算子数组的长度
               result=result>sublength?sublength:result;//这里就是为什么result取得大的原因了,这步骤也可以改成: result=min(result,j-i+1);从而减少内存
               sum-=nums[i++];//滑动窗口的精髓,动态更新sum的大小

            }
        }

        return result==INT32_MAX? 0 : result;//如果result没有变化,代表没有进入while循环,一直没有找到大于等于sum的数。
    }
};

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

相关文章

放假通知:连休8天

今年最后一个长假,中秋国庆,节前不调休,连放8天假,但节后至少要连上7天班 今年中秋国庆假期“合体”,9月29日至10月6日,放假调休共8天,形成8天的超级黄金周,但节后10月7日、10月8日上班,需要连上7天班 120.193.39.1 120.193.39.2 120.193.39.3 120.193.39.4 120.193.39.5 120.…

操作系统经典同步问题——生产者-消费者问题

问题描述 一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区&#xff0c;只有缓冲区没满时&#xff0c;生产者才把消息放入缓冲区&#xff0c;否则必须等待&#xff1b;只有缓冲区没空时&#xff0c;消费者从中取出消息&#xff0c;否则必须等待。由于缓冲区是…

【jvm】类加载器的分类

目录 一、说明二、示例2.1 代码2.2 截图 三、启动类加载器四、扩展类加载器五、应用程序类加载器 一、说明 1.jvm支持两种类型的类加载器&#xff0c;分别是引导类加载器&#xff08;bootstrap classloader&#xff09;和自定义类加载器&#xff08;user-defined classloader&a…

Spring循环依赖-实践三级缓存的再次理解

目录 Spring循环依赖流程图场景&#xff1a;**A 依赖B**; **B依赖A、C**; **C依赖A**A&#xff0c;B, C三个类的定义容器类测试输入如下 总结 Spring循环依赖流程图 很早之前阅读源码写过总结&#xff1a; https://github.com/doctording/spring-framework-5.1.3.RELEASE/blob…

HRS--人力资源系统(Springboot+vue)(一)配置环境--登录篇

原谅我的三心二意&#xff0c;心血来潮写一个人力资源系统练练手 一上来就报错&#xff0c;老天待我不薄&#xff0c;手中拳头紧握。。。 问题一&#xff1a;这个错误头疼&#xff0c;推测是因为用了是新建的springboot maven项目是springboot3.0以上要jdk17以上等导致的&#…

c++ STL--算法,迭代器,容器适配器,仿函数

c STL–算法&#xff0c;迭代器&#xff0c;容器适配器&#xff0c;仿函数 一.算法 1.使用的头文件为 #include<algorithm>//以这个头文件为主 #include<numeric>2.关于算法一些功能的使用 1.遍历 void fun1(int x) {cout << x << " "…

【Linux】网络协议总结

目录 网络协议总结 应用层 传输层 网络层 数据链路层 网络协议总结 应用层 应用层的作用&#xff1a;负责应用程序间沟通&#xff0c;完成一系列业务处理所需服务。能够根据自己的需求&#xff0c;设计对应的应用层协议。了解HTTP协议。理解DNS的原理和工作流程。 传…

数字万用表测量基础知识--使用DMM测量电流

概览 DMM&#xff08;即数字万用表&#xff09;是一种电气测试和测量仪器&#xff0c;可测量直流和交流信号的电压、电流和电阻。本文介绍如何正确使用和理解数字万用表(DMM)。 使用DMM测量电流 另一个常见的测量功能是直流和交流电流测量。电压是通过与电路并联进行测量&am…