LeetCode 209. 长度最小的子数组

长度最小的子数组

题目链接 209. 长度最小的子数组

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

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

示例 1:

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

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

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

题目解释

这道题目是在众多子数组中,找到我们改子数组的总和大于等于target的情况,并且我们希望子数组的元素个数最少.

算法原理

下面我们说一下我们的暴力的想法,我们可以使用两层循环,判断我们的子数组的元素和.

for(i=0; i < num.size(); i++)
{
    int sum = num[i];
    for(j = i+1; j < num.size(); j++)
    {
        if(sum == target)
        {
            // 记录我们的子数组的长度
        }
          
        sum += num[j];
    }
}

如果我们仔细看题目,那么我们会发现我们数组的元素都是正整数,这就造成了我们的如果累加元素,那么和一定是增加的,这里可以做一个优化.

for(i=0; i < num.size(); i++)
{
    int sum = num[i];
    for(j = i+1; j < num.size(); j++)
    {
        if(sum == target)
        {
            // 记录我们的子数组的长度
            break; // 没有必要继续下去了
        }
        else if(sum > target)
        {
            break; // 没有必要继续下去了
        }
        sum += num[j];
    }
}

这里我们还是发现的,我们并没有本质的优化.下面说我们的方法二,这里我们按照示例 1来举例子.这里我们可以很容易发现我们使用的是双指针, 那么为何我们使用双指针可以解决这个问题?还是因为我们的额和具有单调性,你会发现在我们寻找一个子数组中我们的和总是增加的,

image-20231024182508739

当我们的sum大于等于我们的target,你会发现我们以下标left=0的子数组所有情况已经结束了,下面就是我们的让left向后移动,这里请问我们right需要重新初始化和left一样吗?需要的,但是我们这里不是必须的,下面解释下

  • 原本的sum == target,那么我们left右移后新的sum一定小于target,如果我们初始化right,他还是会走的这个位置的
  • 原本的sum > target,这个我们需要讨论下

image-20231024200639985

一旦出现第二种情况,也就是sum2>target,但是这里隐含一个事情,那么就是我们的sum1<target.我们这里奇怪的是我们移动left,这里我们仍旧产生两个情况,或者是三个,不过我们主要说两个.

image-20231024201134890

  • sum2 < target,这里非常好,我们可以继续向后遍历right
  • sum2 > target,这里只能证明一点,以新的left作为起点的子数组是没有复合条件的,要知道我们所有的sum1都是小于target,但是加入一个元素就大于了,后面怎么可能

前面我们说了很多,但是可以总结为两点

  • 使用双指针, 可以使用双指针是因为这里的sum是单调的
  • left和right只会通向,始终沿着一个方向移动

像这种模式,我们有另外一个名词,就是滑动窗口.是的,他的本质还是我们的双指针.只不过我们的left和right是窗口的两个边.滑动窗口的步骤一般是下面这样的

  • 定义left和right变量
  • 进窗口
  • 判断结果
  • 出窗口

这里还有一个更新结果的步骤,不过具体的问题具体分析.关于我谈的这些步骤,希望大家是理解他,可以作为一个参考的大纲,但不是一定符合的.

细节补充

上面我们都是大篇幅的谈了滑动窗口,通过这道题目补充些细节,看代码

int ret = INT_MAX;   // 这是结果
int left = 0, right = 0;
int sum = 0; // 子数组的和
while(right < n)
{
    sum += num[right];  // 进窗口
    while(sum >= target)// 这就是判断,为何是while,可能出现这样的情况  num = [1 1 1 1 1000] target = 10000 
    {
        ret = min(ret,right-left+1); // 更新结果
        sum -= num[left++];  // 出窗口
    }
    right++;
}

代码编写

class Solution
{
public:
  int minSubArrayLen(int target, vector<int> &nums)
  {
    int ret = INT_MAX; // 这是结果
    int left = 0, right = 0;
    int sum = 0; // 子数组的和
    int n = nums.size();
    while (right < n)
    {
      sum += nums[right];    // 进窗口
      while (sum >= target) // 这就是判断,为何是while,可能出现这样的情况  num = [1 1 1 1 1000] target = 10000
      {
        ret = min(ret, right - left + 1); // 更新结果
        sum -= nums[left++];               // 出窗口
      }
      right++;
    }
    return ret == INT_MAX ? 0 : ret;
  }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【刷题-PTA】堆栈模拟队列(代码+动态图解)

【刷题-PTA】堆栈模拟队列(代码动态图解) 文章目录 【刷题-PTA】堆栈模拟队列(代码动态图解)题目输入格式:输出格式:输入样例:输出样例: 分析题目区分两栈解题思路伪代码动图演示代码测试 题目 题目描述 : 设已知有两个堆栈S1和S2&#xff0c;请用这两个堆栈模拟出一个队列Q。 …

【数据结构】线性表(十)队列:循环队列及其基本操作(初始化、判空、判满、入队、出队、存取队首元素)

文章目录 队列1. 定义2. 基本操作 顺序队列循环队列1. 头文件和常量2. 队列结构体3. 队列的初始化4. 判断队列是否为空5. 判断队列是否已满6. 入队7. 出队8. 存取队首元素9. 获取队列中元素个数10. 打印队列中的元素9. 主函数10. 代码整合 堆栈Stack 和 队列Queue是两种非常重要…

虚拟机VMware Workstation Pro安装配置使用服务器系统ubuntu-22.04.3-live-server-amd64.iso

虚拟机里安装ubuntu-23.04-beta-desktop-amd64开启SSH(换源和备份)配置中文以及中文输入法等 ​一、获取Ubuntu服务器版 获取Ubuntu服务器版 二、配置虚拟机 选择Custom(advanced)&#xff1a; 选择Workstation 17.x: 选择“I will install the operating system later.”…

I/O设备的概念和分类,I/O控制器

文章目录 1.什么是I/O设备2.按使用特性分类1.人机交互类外部设备2.存储设备3.网络通信设备 3.按传输速率分类1.低速设备:2.中速设备:3.高速设备: 4.按信息交换的单位分类1.块设备:2.字符设备: 5.I/O设备的机械部件6.I/O设备的电子部件&#xff08;I/O控制器&#xff09;1.接收和…

Vue中的加密方式(js-base64、crypto-js、jsencrypt、bcryptjs)

目录 1.安装js-base64库 2. 在Vue组件中引入js-base64库 3.使用js-base64库进行加密 4.Vue中其他加密方式 1.crypto-js 2.jsencrypt 3.bcryptjs 1.安装js-base64库 npm install js-base64 --save-dev 2. 在Vue组件中引入js-base64库 import { Base64 } from js-ba…

快速排序(c语言代码实现)

交换排序&#xff1a;快速排序&#xff08;不稳定的排序&#xff09; 快速排序&#xff08;Quick Sort&#xff09;是一种常见的排序算法&#xff0c;它采用分治法的思想&#xff0c;对待排序序列进行划分&#xff0c;使得划分出的子序列可以分别进行排序&#xff0c;最终使整…

2、Linux权限理解

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 前言 Linux权限的概念 1.文件访问者的分(人) 2.文件类型和访问权限(事物属性) 3.文件权限值的表示方法 4.文件访问权限的相关设置方法 file指令 目录的权限 粘滞位 关于权限的总结 前言 在开始Linux权限理…

python二次开发Solidworks:读取样条曲线数据

目录 1、草图段对象 2、VBA代码分析 3、python代码实现 样条曲线&#xff08;spline curve&#xff09;是数学术语&#xff0c;是一种特殊的参数曲线&#xff0c;由一组控制点通过曲线拟合的方式生成。样条一词源于船舶建造中的一种临时性辅助支架&#xff0c;后来被引入计算…

Kettle循环结果集中的数据并传入SQL组件【或转换】里面

简介&#xff1a;在尝试使用了结果集的Demo循环后&#xff0c;进入到生产还是有一点问题的&#xff0c;以下是各个组件的分解解释、遇到的问题&#xff0c;以及解决问题的思路&#xff0c;最后文章的最后会把完整的Ktr文件放出来。记得收藏点赞喔&#xff01; 先来看张图~来自…

MOTHERNEST双十一我们的目标是:不愁货——有!不愁钱——折!

喜迎双十一&#xff0c;MOTHERNEST进入开抢模式&#xff0c;水飞蓟护肝片&#xff0c;牛初乳粉&#xff0c;液体钙维生素D3胶囊将进行抢购模式&#xff0c;每人限购4件。 开抢时间&#xff1a; 2023.10.31 20:00-2023.10.31 23:59 2023.11.03 20:00-2023.11.03 23:59 限量每…

目标检测的方法

目标检测大致分为两个方向&#xff1a;基于传统的目标检测算法和基于深度学习的目标检测算法。 1.基于传统的目标检测算法 在利用深度学习做物体检测之前&#xff0c;传统算法对于目标检测通常分为3个阶段&#xff1a;区域选取、特征提取和体征分类。 2.基于深度学习的目标检测…

win10安装spark

一、进入spark下载页面 连接 Downloads | Apache Spark 二、解压下载后的.tgz文件 直接解压即可 三、运行 运行bin目录下的 spark-shell.cmd 提示 Did not find winutils.exe: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.hom…

NSSCTF做题第9页(3)

[GKCTF 2020]CheckIN 代码审计 这段代码定义了一个名为ClassName的类&#xff0c;并在脚本的最后创建了一个ClassName类的实例。 在ClassName类的构造函数中&#xff0c;首先通过调用$this->x()方法获取了请求参数$_REQUEST中的值&#xff0c;并将其赋值给$this->code属性…

短视频矩阵系统软件源码

短视频矩阵系统软件源码 视频成为获得免费流量最便宜的渠道&#xff0c;平台给所有视频最基础的保底流量。如果按照一个视频最低500流量计算&#xff0c;5个账户就是2500的流量&#xff0c;200个视频就是50W流量&#xff0c;如果从其他渠道获得50W流量是个很困难的事情。短视频…

kubeadm初始化的k8s集群证书续期—— 筑梦之路

脚本自动化方式 这个是一个开源的项目&#xff1a;https://gitee.com/ximy/update-kube-cert 该项目可以自动化更新k8s集群的证书&#xff0c;使用也很简单。 该脚本可将 kubeadm 生成的证书有效期更新为 10 年。 git clone https://github.com/yuyicai/update-kube-cert.g…

Notepad++正则查询替换操作

Notepad编辑器查找功能非常强大&#xff0c;本处记录一些实战中常用到复杂查询替换操作。 注意&#xff1a;如果是重要文件&#xff0c;替换操作前最好备份&#xff1b;当前一个操作后也可以用ctrlz恢复。 查找重复行 用查找(ctrlf)功能&#xff0c;用正则表达式模式匹配。 查…

PyCharm改变代码背景图片的使用教程

一个好的集成环境是学习和使用一门编程语言的重中之重&#xff0c;这次我给大家分享如何改变PyCharm软件的代码背景图片。 说明&#xff1a;本教程使用的是汉化版PyCharm软件。 打开PyCharm软件。 点击软件最上方导航栏的文件&#xff0c;然后找到设置。 打开设置然后点击外观…

【离散数学必刷题】命题逻辑(第一章 左孝凌)刷完包过!

复习16题&#xff1a; 【1】下列哪个语句是真命题&#xff08;&#xff09; A、今天天气真好&#xff01; B、我正在说谎。 C、如果7 2 10 &#xff0c;那么4 6 5。 D、如果7 2 9 &#xff0c; 则 4 6 5。 对于A&#xff0c;只有具有确定真值的陈述句才是命题&#xf…

酷开科技 | 酷开系统沉浸式大屏游戏更解压!

随着家庭娱乐需求日益旺盛&#xff0c;越来越多的家庭消费者和游戏玩家开始追求大屏游戏带来的沉浸感。玩家在玩游戏的时候用大屏能获得更广阔的视野和更出色的视觉包围感&#xff0c;因此用大屏玩游戏已经成为了一种潮流。用酷开系统玩大屏游戏&#xff0c;过瘾又刺激&#xf…

C语言每日一题(19)回文素数

牛客网 BC157 回文素数 题目描述 描述 现在给出一个素数&#xff0c;这个素数满足两点&#xff1a; 1、 只由1-9组成&#xff0c;并且每个数只出现一次&#xff0c;如13,23,1289。 2、 位数从高到低为递减或递增&#xff0c;如2459&#xff0c;87631。 请你判断一下&am…
最新文章