题目
https://leetcode-cn.com/problems/minimum-size-subarray-sum/
给定一个含有 n 个正整数的数组和一个正整数 target .
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] , 并返回其长度. 如果不存在符合条件的子数组, 返回 0 .
思路
- 利用左右指针, 维护左指针和当前总和
- 从 0 开始, 遍历右指针, 总和自增
- 循环里判断, 比 target 大, 那么计下当前最小数组长度, 并且 sum 减去最左值, 左指针向右移动一位
代码
public int minSubArrayLen(int target, int[] nums) {
int length = nums.length;
// 最终结果, 默认是长度 + 1, 即表示默认没有符合条件的
int result = length + 1;
int sum = 0;
// 左指针
int left = 0;
// 右指针
for (int right = 0; right < nums.length; right++) {
// 每次自增
sum += nums[right];
// 循环里判断
while (sum >= target) {
// 记录下更小的数组长度
// 当前数组长度 = 右指针 - 左指针 + 1
result = Math.min(result, right - left + 1);
// 减去左值, 并且移动左指针
sum -= nums[left++];
}
}
// 比较是否存在符合条件的数组
return result > length ? 0 : result;
}