题目:
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
进阶:
如果你已经完成了 O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
类型:
下面是一些我们用来判断我们可能需要上滑动窗口策略的方法:
- 这个问题的输入是一些线性结构:比如链表呀,数组啊,字符串啊之类的
- 让你去求最长/最短子字符串或是某些特定的长度要求
思路:
滑动窗口
扩展:
Integer.MAX_VALUE
是Integer类中的一个int类型的常量MAX_VALUE。它代表int所能表示的最大值 0x7FFFFFFF。
相对应的是Integer类中的另一个常量MIN_VALUE,它代表int所能表示的最小值 0x80000000
代码入下:。
/**
* 长度最小的子数组
* @param s
* @param nums
* @return
*/
public int minSubArrayLen (int s, int[] nums) {
int sum = 0;
// 设立两个指针,滑动窗口
int start = 0;
int length = Integer.MAX_VALUE;
// end 移动指针
for (int end = 0; end < nums.length; end++) {
sum += nums[end];
while (sum >= s) {
length = Integer.min(length, end - start + 1);
sum -= nums[start++];
}
}
return length == Integer.MAX_VALUE? 0: length;
}