给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
- 输入:s = 7, nums = [2,3,1,2,4,3]
- 输出:2
- 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
提示:
- 1 <= target <= 10^9
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^5
解题思路:
用双指针技巧来维护一个滑动窗口,通过累加和的方式寻找满足条件的最短子数组长度。
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
package com.yang;
public class Test01 {
public static void main(String[] args) {
int[] nums = {2, 3, 1, 2, 4, 3};
System.out.println(minSubArrayLen(7, nums));
}
//给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续
子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
public static int minSubArrayLen(int target, int[] nums) {
//起始位置下标
int index = 0;
//收集元素集合的和
int sum = 0;
//子集长度
int len = 0;
//结果
int result = Integer.MAX_VALUE;
// i 为终止位置下标,遍历整个数组
for (int i = 0; i < nums.length; i++) {
sum += nums[i]; // 累加当前元素到 sum 中
// 当 sum 大于等于目标值 target 时,进入循环找最短子数组
while (sum >= target) {
len = i - index + 1; // 计算当前子数组的长度
result = Math.min(len, result); // 更新最小子数组长度到 result 中
sum -= nums[index]; // 减去起始位置元素,尝试缩小子数组长度
index++; // 移动起始位置 index,寻找更短的子数组
}
}
return result == Integer.MAX_VALUE ? 0 : result; // 返回最短子数组长度,如果result 未被更新过则返回 0
}
}