题目
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
- 来源:力扣(LeetCode)
- 链接:leetcode.cn/problems/mi…
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一
思路
- 滑动窗口
代码
public int minSubArrayLen(int target, int[] nums) {
int start = 0;
int end = -1;
int sum = 0;
boolean found = false;
int minLength = nums.length;
while (end < nums.length) {
if (sum >= target) {
found = true;
int len = end - start + 1;
if (len < minLength) {
minLength = len;
}
sum = sum - nums[start];
start = start + 1;
} else {
end++;
if (end >= nums.length) {
break;
}
sum = sum + nums[end];
}
}
return found ? minLength : 0;
}
- 上面的代码有点丑。
官方版
public int minSubArrayLen(int target, int[] nums) {
int i = 0;
int j = 0;
int sum = 0;
int min = nums.length + 1;
while (j < nums.length) {
sum = sum + nums[j];
while (sum >= target) {
min = Math.min(min, j - i + 1);
sum = sum - nums[i++];
}
j++;
}
return min == nums.length + 1 ? 0 : min;
}
复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)