LeetCode:209. 长度最小的子数组

简介: 题目描述:给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和≥ target的长度最小的连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回0。

🍎道阻且长,行则将至。🍓


🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


一、🌱209. 长度最小的子数组

  • 题目描述:给定一个含有 n 个正整数的数组和一个正整数 target 。

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

  • 来源:力扣(LeetCode)
  • 难度:中等
  • 提示:

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

  • 示例 1:

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

🌴解题

1.暴力查找

直接使用两层for循环,最终找到最短子数组。所以时间复杂度是O(n^2^)。

2.双指针滑动法

我们有可能只遍历一遍数组就可以得到最短子数组:
step1:当我们遍历数组找到第一个复合条件的子数组时(例如从0到5的子数组),长度length赋值;
step2:我们就可以把当前子数组的第一个删去(例如从1到5的),子数组长度length -1;
==◇==判断当前子数组会不会满足target,满足则继续step2,直到不满足条件时(4到5的),找数组下一个(4到6的)。所以以上过程就是使用两个指针来完成。

  • code:
class Solution {
    publicint minSubArrayLen(int target, int[] nums) {
        int k=0;//从这个开始
        int i=0;//到这个
        int sum=0;//k到i的和
        int ans=0;//没找到
        sum+=nums[i];
        for(;k<nums.length;k++) {
            while (sum < target&&i< nums.length) {
                i++;
                if(i==nums.length)
                    break;
                sum+=nums[i];
            }

            if(sum>=target) {//找到了
                if (ans == 0) {
                    ans = i - k + 1;
                } else
                    ans = ans > i - k + 1 ? i - k + 1 : ans;//是否更短子数组
                sum -= nums[k];//从k下一个
            }
        }
        return ans;
    }
}

image.png


返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

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