题目详情
解法一:暴力解法
这也是最容易想到的,用双重for循环遍历数组,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。
解法二:滑动窗口
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
根据上图总结来说就是当窗口内的和小于目标值时向右移动 j,大于等于目标值时,先比较(并记录)现在的子序列长度,然后向右移动 i,直到 j 到最右侧。
从而将 O ( n 2 ) O(n^2) O(n2)的暴力解法降为 O ( n ) O(n) O(n)。
Java代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum=0;
int left=0;
int subLength;
int result = Integer.MAX_VALUE;
for(int right=0;right<nums.length;right++){
sum+=nums[right];
// 注意这里使用while,每次更新 left(起始位置),并不断比较子序列是否符合条件
while(sum>=target){
subLength=(right-left+1);
result=result<subLength?result:subLength;
sum-=nums[left];
left++;// 这里体现出滑动窗口的精髓之处,不断变更left(子序列的起始位置)
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == Integer.MAX_VALUE? 0:result;
}
}