首页 > 其他分享 >LeetCode 209. 长度最小的子数组

LeetCode 209. 长度最小的子数组

时间:2023-05-05 16:33:21浏览次数:67  
标签:窗口 209 res 位置 起始 数组 滑动 LeetCode

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

本题是一个滑动窗口的题,
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
在本题中实现滑动窗口,主要确定如下三点:

窗口内是什么?窗口就是 满足其和 ≥ target 的长度最小的 连续 子数组。
如何移动窗口的起始位置?窗口的起始位置如何移动:如果当前窗口的值大于target了,窗口就要向前移动了(也就是该缩小了)。
如何移动窗口的结束位置?窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

代码如下:

func minSubArrayLen(target int, nums []int) int {
    n:=len(nums) //数组的长度
    sum:=0  //表示每一段子数组的总和
    res:=n+1  //最终的结果(最小的连续子数组个数)初始化为n+1,目的是为了判断“不存在符合条件的子数组,返回0”的情况
    for i,j:= 0,0;i < n;i++{   //i 表示滑动口的终止位置,j表示滑窗动窗口的起始位置,初始时都是 0
        sum += nums[i]  //加上该元素
        // 注意这里使用for,每次更新 j(起始位置),并不断比较子序列是否符合条件
        for sum >= target{ 
            sublength :=  i - j + 1   //sublength滑动窗口的长度
            if sublength < res {  //res始终保存的是满足结果的连续子数组长度的最小值
                res = sublength
            }   
            sum -= nums[j]  // 这里体现出滑动窗口的精髓之处,不断变更j(子序列的起始位置)
            j++
        }
    }
    if res == n+1 {
        res = 0
    }
    return res
}

标签:窗口,209,res,位置,起始,数组,滑动,LeetCode
From: https://www.cnblogs.com/lxing-go/p/17374514.html

相关文章

  • 350. 两个数组的交集 II
     分析: 跟上道题一样,但是可以重复代码:classSolution(object):defintersect(self,nums1,nums2):""":typenums1:List[int]:typenums2:List[int]:rtype:List[int]"""count=[]......
  • LeetCode 977. 有序数组的平方
    题目链接:LeetCode977.有序数组的平方本题直接暴力求解就是先求出每个元素平方后的值,再对平方后的值进行排序,双指针解法由于数组其实是有序的,只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。此时可以考虑双指......
  • LeetCode 27. 移除元素 题解
    题目链接:LeetCode27.移除元素本题大意是要对一个数组进行原地删除数值等于val的元素。双指针算法:通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。快指针(p指针):寻找新数组的元素,新数组就是不含有目标元素的数组慢指针(q指针):指向更新新数组下标的位置当......
  • 349. 两个数组的交集
     分析:本来刷二分的,但是这道题不用双指针也能做所以就偷个懒,加上数组范围小,遍历就行代码:1classSolution(object):2defintersection(self,nums1,nums2):3"""4:typenums1:List[int]5:typenums2:List[int]6:rtyp......
  • LeetCode 704. 二分查找 题解
    本题考查的就是一个基本的整数二分查找问题对于整数二分,有单调性一定可以二分,没有单调性的有时候也可以二分。算法思想(分为两种方法):查找结果是在左边区间的情况区间被划分为[l,mid]和[mid+1,r]1、确定分界点,mid=q[(l+r)/2]2、判断是否满足是:区间变成[l,mid]因此:r=mid否......
  • LeetCode 1049. 最后一块石头的重量 II
    思路任何时刻,某个石头的重量永远都是若干石头加减运算的绝对值如a-b+c合并石头都是减法,但仍可能出现+运算符,如a-(b-c)=a-b+c任何一种合并方法,最后一个石头的重量都可以表示成一种代数形式,如a+b-c+d+e+f-g不是所有的代数形式都可以转换为一种合并方法,如a+b+c因此......
  • IP地址字符串转数组
    查看代码staticuint8_tip_buf[4];staticuint8_ttest_str[]="192.168.1.123";staticuint8_tipstr2num(uint8_t*src_str);voidipstr2num(uint8_t*src_str){inti=0,j=0,k=0;charnew_str[3];while(*src_str!='\0'......
  • [Leetcode] 0697.数组的度
    697.数组的度点击上方标题跳转至leetcode题目描述给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在nums中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例1:输入:nums=[1,2,2,3,1]输......
  • LeetCode 416 分割等和子集
    LeetCode|416.分割等和子集给你一个只包含正整数的非空数组 nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例1:输入:nums=[1,5,11,5]输出:true解释:数组可以分割成[1,5,5]和[11]。示例2:输入:nums=[1,2,3,5]输出:false解......
  • 6-2 数组排序输出(函数模板)
    对于输入的每一批数,按从小到大排序后输出。一行输入为一批数,第一个输入为数据类型(1表示整数,2表示字符型数,3表示有一位小数的浮点数,4表示字符串,0表示输入结束),第二个输入为该批数的数量size(0<size<=10),接下来为size个指定类型的数据。输出将从小到大顺序输出数据。函数接口定义:sor......