LeetCode209_长度最小的子数组
LeetCode209_长度最小的子数组
- 标签:#数组 #二分查找 #前缀和 #滑动窗口
- Ⅰ. 题目
- Ⅱ. 示例
- 0. 个人方法:滑动窗口
标签:#数组 #二分查找 #前缀和 #滑动窗口
Ⅰ. 题目
给定一个含有 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
0. 个人方法:滑动窗口
使用滑动窗口的思想:
- 定义两个指针 start 和 end 表示窗口的左右边界。
- 每次将 end 指向的元素加入 sum 中。
- 若 sum >= target,就尝试收缩左边界 start,以缩短窗口长度,同时更新最小长度 min_len。
- 最后如果没找到满足条件的子数组,返回 0;否则返回最小长度。
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();int start = 0, end = 0;int sum = 0;int min_len = n + 1; // 初始化为不可能的值while (end < n) {sum += nums[end]; // 先加上当前元素end++; // 然后移动右指针// 如果 sum >= target,尝试缩小窗口while (sum >= target) {min_len = min(min_len, end - start); // 更新最小长度sum -= nums[start]; // 尝试移除左端元素start++; // 移动左指针}}return (min_len == n + 1) ? 0 : min_len;}
};
-
复杂度分析
-
时间复杂度:O(n),其中 n 是数组的长度。指针 start 和 end 最多各移动 n 次。
-
空间复杂度:O(1)。
-