题目描述
和大于等于target 的最短子数组
给定一个含有 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
解题思路
滑动窗口,从头开始顺序遍历,以i为基准,顺序求满足要求的最小要求。实现代码
public int minSubArrayLen(int target, int[] nums) {int n = nums.length;if (n == 0) {return 0;}int ans = Integer.MAX_VALUE;int start = 0, end = 0;int sum = 0;while (end < n) {sum += nums[end];while (sum >= target) {ans = Math.min(ans, end - start + 1);sum -= nums[start];start++;}end++;}return ans == Integer.MAX_VALUE ? 0 : ans;}
时间及空间复杂度分析
时间复杂度,O(n)
拓展思路
前缀和 + 二分查找
