给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-size-subarray-sum
//给定一个含有 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 <= 10⁹
// 1 <= nums.length <= 10⁵
// 1 <= nums[i] <= 10⁵
//
//
//
//
// 进阶:
//
//
// 如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。
//
// Related Topics 数组 二分查找 前缀和 滑动窗口 👍 1203 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len = Integer.MAX_VALUE;
int left = 0;
int right = 0;
int tempSum = 0;
//right在前是快指针,应该首先满足条件
while (right < nums.length) {
//搜索加自增都要判断条件每次运行 都要判断条件是否满足
while (right < nums.length && tempSum < target) {
tempSum += nums[right++];
}
//减元素每次都要判断是否满足条件
while (left < nums.length && tempSum >= target) {
len = (right - left) < len ? right - left : len;
tempSum -= nums[left++];
}
}
if(len == Integer.MAX_VALUE)
return 0;
return len;
// int i = 0;
// int j = 0;
// int sum = 0;
// int result = Integer.MAX_VALUE;
// while (j < nums.length) {
// while (j < nums.length && sum < target) {
// sum += nums[j++];
// }
// while (i < nums.length && sum >= target) {
// int subLen = j - i;
//
// result = result > subLen ? subLen : result;
// sum -= nums[i++];
// }
// }
// if (result == Integer.MAX_VALUE)
// return 0;
// else
// return result;
}
}
//leetcode submit region end(Prohibit modification and deletion)