图解LeetCode——209. 长度最小的子数组

简介: 图解LeetCode——209. 长度最小的子数组

一、题目

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

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

二、示例

2.1> 示例 1:

输入】target = 7, nums = [2,3,1,2,4,3]

输出】2

解释】子数组 [4,3] 是该条件下的长度最小的子数组。

2.2> 示例 2:

输入】target = 4, nums = [1,4,4]

输出】1

2.3> 示例 3:

输入】target = 11, nums = [1,1,1,1,1,1,1,1]

输出】0

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

三、解题思路

根据题目描述我们要找出该数组中满足其和大于等于target长度最小连续子数组。那么对于“连续子数组”这个关键点,我们很容易就会想到能否采用滑动窗口来解决这道题。

而题目中的另一个关键点——连续子数组其和需要大于等于target,那么就可以理解为变化窗口大小的依据了,具体规则如下所示:

规则1】如果连续子数组其和 大于等于 target,则扩大窗口的右侧部分;

规则2】如果连续子数组其和 小于 target,则缩小窗口的左侧部分;

随着遍历结束,我们返回满足上述条件中最小长度即可;在解题过程中,我们可以采用双指针的方式来模拟滑动窗口。那么以上就是本题的解题思路了,为了便于大家理解,我们一下以输入 target = 7, nums = [2,3,1,2,4,3]为例,看一下具体的操作流程是怎么样的。具体请见下图所示:

四、代码实现

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int i = 0, j = 0, sum = nums[0], result = 100001;
        while(true) {
            if (sum < target) {
                if (j >= nums.length - 1) break;
                sum += nums[++j]; // 向右移动右指针
            } else {
                result = Math.min(result, j - i + 1); 
                sum -= nums[i++]; // 向右移动左指针
            }
        }
        return result == 100001 ? 0 : result;
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
3天前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
3天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
12 0
|
3天前
leetcode代码记录(长度最小的子数组
leetcode代码记录(长度最小的子数组
10 0
|
3天前
【力扣】209. 长度最小的子数组
【力扣】209. 长度最小的子数组
|
3天前
|
算法 测试技术
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
|
3天前
|
算法
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
29 0
|
3天前
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
44 0
|
3天前
|
存储
【Leetcode 209】长度最小的子数组 —— 滑动窗口|双指针
我们可以使用双指针解决本题,定义两个指针 i 和 j 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量 sum 存储子数组中的元素和。每一轮迭代中,每当 sum >= target 则记录子数组最小长度,移动慢指针。在每一轮迭代最后,移动快指针
|
3天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
9 0
|
3天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
12 0