LeetCode 209. 长度最小的子数组

题目链接: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
}

posted @   小星code  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示