【力扣】209. 长度最小的子数组

简介: 【力扣】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

提示:

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

进阶:

  • 如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

解题方法

  • C 暴力双循环——超时
int mymin(int a, int b) {
    if (a > b)
        return b;
    else
        return a;
}

int minSubArrayLen(int target, int* nums, int numsSize) {
    int count = INT_MAX;
    if (numsSize == 0) {
        return 0;
    }
    for (int i = 0; i < numsSize; i++) {
        int sum = 0;
        for (int j = i; j < numsSize; j++) {
            sum = sum + nums[j];
            if (sum >= target) {
                count = mymin(count, j - i + 1);
                break;
            }
        }
    }

    return count == INT_MAX ? 0 : count;
}
  • C 滑动窗口法
int mymin(int a, int b) {
    if (a > b)
        return b;
    else
        return a;
}

int minSubArrayLen(int target, int* nums, int numsSize) {
    int count = INT_MAX;
    int start = 0, end = 0; // 定义窗口开始、结束
    int sum = 0;
    if (numsSize == 0) {
        return 0;
    }
    while (end < numsSize) {
        sum = sum + nums[end]; // 求窗口中元素和
        while (sum >= target) {
            count = mymin(count, end - start + 1); // 求最小窗口
            sum = sum - nums[start];               // 求和
            start++;                               // 缩小窗口
        }
        end++; // 增大窗口
    }
    return count == INT_MAX ? 0 : count;
}


复杂度分析

时间复杂度为 O(n),其中 n 是数组的长度。

空间复杂度为 O(1)。







相关文章
|
6天前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
6天前
|
Go
golang力扣leetcode 713.乘积小于K的子数组
golang力扣leetcode 713.乘积小于K的子数组
21 0
|
6天前
|
Java C++ Python
leetcode-209:长度最小的子数组
leetcode-209:长度最小的子数组
24 0
|
6天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
12 0
|
6天前
leetcode代码记录(长度最小的子数组
leetcode代码记录(长度最小的子数组
11 0
|
6天前
|
算法 测试技术
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
|
6天前
|
算法
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
30 0
|
6天前
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
44 0
|
6天前
|
存储
【Leetcode 209】长度最小的子数组 —— 滑动窗口|双指针
我们可以使用双指针解决本题,定义两个指针 i 和 j 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量 sum 存储子数组中的元素和。每一轮迭代中,每当 sum >= target 则记录子数组最小长度,移动慢指针。在每一轮迭代最后,移动快指针
|
6天前
leetcode:643. 子数组最大平均数 I(滑动窗口)
leetcode:643. 子数组最大平均数 I(滑动窗口)
17 0