从小白开始刷算法 滑动窗口篇 leetcode.209

简介: 从小白开始刷算法 滑动窗口篇 leetcode.209

209.长度最小的子数组


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


题目来源:力扣(LeetCode)


滑动窗口思路


能否写出:能写出。

时间:20多分钟

思路:

  1. 初始化结果变量 result 为数组长度加一,表示尚未找到满足条件的子数组。
  2. 初始化两个指针 ij,分别表示子数组的起始和结束位置。
  3. 使用一个循环遍历数组,不断向右移动指针 j,并累加子数组的和 total
  4. total 大于等于目标值时,进入内层循环。
  5. 在内层循环中,更新结果变量 result 为当前子数组长度和之前的结果变量中的较小值。
  6. 减去指针 i 所指向的元素,并将指针 i 右移一位,缩小子数组的范围。
  7. 重复步骤 5 和步骤 6,直到 total 不再大于等于目标值。
  8. 返回最终的结果 result,如果 result 仍然为数组长度加一,则说明未找到满足条件的子数组,返回 0。
// 仅是我的思路代码,leetcode上大神更厉害
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int result = nums.length + 1;
        int total = 0;
        int i = 0;
        int j = 0;
        while (j < nums.length) {
            total = total + nums[j];
            j++;
            while (total >= target) {
                result = Math.min(result, j - i);
                total = total - nums[i];
                i++;
            }
        }
        return result == nums.length + 1 ? 0 : result;
    }
}

时间复杂度: O(n)

空间复杂度:O(1)

相关文章
|
3月前
|
算法
【算法】滑动窗口——最大连续1的个数
【算法】滑动窗口——最大连续1的个数
|
26天前
【LeetCode 26】239.滑动窗口最大值
【LeetCode 26】239.滑动窗口最大值
29 1
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
37 0
|
3月前
|
算法
【算法】滑动窗口——最小覆盖子串
【算法】滑动窗口——最小覆盖子串
|
3月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
3月前
|
算法
【算法】滑动窗口——将x减到0的最小操作数
【算法】滑动窗口——将x减到0的最小操作数
|
3月前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
3月前
|
算法
【算法】滑动窗口——长度最小的子数组
【算法】滑动窗口——长度最小的子数组
|
19天前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
21 2
|
27天前
【LeetCode 04】滑动窗口法总结
【LeetCode 04】滑动窗口法总结
14 0