题目
Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead.
Example:
Input: s = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: the subarray [4,3] has the minimal length under the problem constraint.
Follow up:
If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).
解法思路
- 从数组的起始处撑开一个滑动窗口;
- 以目标值
s
和窗口的值windowLength
的大小关系作为窗口拉长和缩短的依据; - 在窗口拉长和缩短的过程中,维护窗口的值
windowSum
和长度windowLength
; - 在每次窗口的长度发生变化后,检查窗口的值
windowSum
是否 >=s
时,并在满足条件的情况下判断是否出现了更短的窗口;
时间复杂度
- O(N);
关键词
滑动窗口
数组
双指针
二分查找
算法实现
-
l
和r
表示窗口的左右边界; - 窗口完全滑出数组的情况是:
l < nums.length
; - 注意窗口的右边界
r
在滑动的时候不能超过数组的右边界;
package leetcode._209;
public class Solution {
public int minSubArrayLen(int s, int[] nums) {
int l = 0, r = -1;
int windowSum = 0;
int windowLength = nums.length + 1;
while (l < nums.length) {
if (r + 1 < nums.length && windowSum < s) {
r++;
windowSum += nums[r];
} else {
windowSum -= nums[l];
l++;
}
if (windowSum >= s) {
windowLength = Math.min(windowLength, (r - l + 1));
}
}
if (windowLength == nums.length + 1) {
return 0;
}
return windowLength;
}
public static void main(String[] args) {
int[] arr = {2, 3, 1, 2, 4, 3};
int windowLength = (new Solution()).minSubArrayLen(7, arr);
System.out.println(windowLength);
}
}