1 滑动窗口法
就是不断的调节子序列的起始位置和终止位置。
2 算法分析
- 滑动窗口:
时间复杂度:O(n)
空间复杂度:O(1) - 相比暴力解法:
时间复杂度:O(n^2)
空间复杂度:O(1)
进行了时间复杂度上的优化。
我的理解:
-
暴力解法:
每个子数组都被判断了一遍是否大于目标和。 -
滑动窗口:
右指针向数组后加数字时,一旦到了大于等于目标和就会移动左指针,减最前面的数字,显而易见,不是所有的组数组都被判断一遍的。
3 Java实现
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0; //左指针
int sum = 0; // 滑动窗口内数据和
int result = Integer.MAX_VALUE; // 滑动窗口长度
for(int right = 0 ; right < nums.length ; right++){ // 右指针
sum += nums[right]; // 加右边元素
while(sum >= target){ // 大于等于目标和时,
result = Math.min(result, right - left + 1); // 比较长度,选小的
sum -= nums[left++]; // 减左边元素
}
}
return result == Integer.MAX_VALUE ? 0 : result; // 返回结果
}
}