草庐IT

卷进大厂系列之LeetCode刷题笔记:长度最小的子数组(中等)

Faith_xzc 2023-08-16 原文

学算法,刷力扣,加油卷,进大厂!

题目描述

力扣题目链接

给定一个含有 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

提示:

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

涉及算法

这道题目属于中等题型,涉及到数据结构中的数组。对于数组我们要知道以下内容:

  • 数组是存储在连续内存空间的相同类型数据的集合
  • 数组下标都是从0开始
  • 数组在内存空间的地址都是连续的

那么根据题目,我们可以提炼的关键点:

  • 数组和≥ target
  • 数组是连续的
  • 满足以上条件的长度最小

根据这些关键点,我们可以想到这个题目,首先是数组的一个求和(使用遍历数组的方式实现),然后是我们需要求和满足条件:连续和长度最小(这个就要求我们设置在进行遍历数组求和的时候进行设计边界条件)。所以本地的难点在于边界条件的设计。针对这道题目呢,博主有两种思路,下面进行分别介绍:

思路一

使用双循环的暴力解法:

第一个循环用来确定一个子数组的第一个元素(不断后移),第二个循环用来对第一个元素和该循环的元素进行求和,并将和与target比较,满足条件后,用第二个元素和第一个元素的位置求子数组的长度。上一步骤的结果不输出,求所有满足条件的,比较各个子数组长度,输出最短长度的子数组。

思路二

这是数组操作中非常重要的一个方法。首先解释一下什么是滑动窗口:在数组中设置两个指针(有点双指针的意思了哈),称为窗口的起始位置和终止位置,两个位置之间的部分就被成为窗口;然后不断的移动起始位置和终止位置以此来不断移动窗口,即为滑动窗口。

使用滑动窗口的解法:

针对这道题目我们需要思考三个点

  • 窗口内元素满足什么条件
  • 窗口的起始位置怎么确定及如何移动
  • 窗口的终止位置怎么确定

其实这几个点考虑的就是我们前面题目的关键点:

  • 窗口内元素要满足数组和≥ target的最小连续数组s
  • 起始位置就是数组的开始,移动的条件是当前窗口的长度大于s,然后向后移动
  • 终止位置就是for循环遍历数组的指针

滑动窗口的使用就是使得当前窗口内元素之和≥target,然后不断调整起始位置(使用一个for循环,就被把时间降下来了)。

上面的两种思路理解清楚了,就可以开始写了,不懂的可以留言讨论!

题目解答

Java题解一

使用双循环的解法

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0;  //子数组元素之和
        int sublength = 0; //和大于target子数组的长度
        //先将最后结果定义为int的最大值,然后与每次计算的子数组长度比较,返回小的,赋值给result
        int result = Integer.MAX_VALUE;
        for(int i = 0; i < nums.length; i++){ //循环
            sum = 0;//每次循环都分别求子数组之和
            for(int j = i; j < nums.length; j++ ){
                sum += nums[j]; //在i的基础上向后加j个元素
                if(sum >= target ){ //子数组元素之和大于等于target
                    sublength = j - i + 1 ;  //求出子数组长度
                    result = result < sublength ? result : sublength;//求最短的子数组
                    break; //跳出for j循环
                }
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;//找到返回result,没找到返回0
    }
}

Java题解二

使用滑动窗口的暴力解法

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0; //子数组之和
        int i = 0; //滑动窗口的起始位置
        int sublength = 0; //滑动窗口的长度
        int result =  nums.length + 1; //设置返回值,先定义为数组长度加1

        for(int j = 0; j < nums.length; j++){ //循环,滑动窗口的终止位置
            sum += nums[j]; //求窗口内元素之和
            while(sum >= target){ //满足条件
                sublength = j - i + 1; //求窗口长度
                result = result < sublength ? result : sublength;//比较求最小
                sum -= nums[i++]; //滑动窗口的关键,移动起始位置
            }
           
        }
        return result == nums.length + 1 ? 0 : result; //返回结果值
    }
}

有关卷进大厂系列之LeetCode刷题笔记:长度最小的子数组(中等)的更多相关文章

  1. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  5. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  6. ruby - 从 String#split 返回的零长度字符串 - 2

    在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"

  7. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

  8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

随机推荐