长度最小子数组

一、代码思路
1.暴力解法,遍历所有符合题意的子数组,比较最小值可得
2.滑动窗口:
1)窗口内维护sum与target值进行比较。当sum<target时移动右边界,sum>=target时移动左边界。
2)每次移动左边界时,表示缩小窗口长度,则判断窗口最小值是否需要更新(维护变量min)
3)当右边界移动到数组末尾,此时最后一次判断sum>=target,若满足一直移动左边界缩小窗口,不满足则返回最终结果
4)左右边界都可能连续移动,所以都要用while循环代替if判断。 !!!!!!!!!!!!

二、代码实现
class Solution {
public static int minSubArrayLen(int target, int[] nums) {
//滑动窗口思想
int low = 0,high = 0; //滑动窗口左右区间
int sum = 0; //维护窗口内值与target比较
int min = Integer.MAX_VALUE; //最小窗口值
while(high< nums.length){
sum +=nums[high];
while(sum>=target){ //移动左边界
min = Math.min(min,high-low+1);
sum -=nums[low];
low++;

}
high++;
}
return min==Integer.MAX_VALUE?0:min;
}
}

三、注意事项
1.看似两层循环,实则左边界和右边界最多遍历数组一次,2*O(n),时间复杂度远比暴力低得多
2.滑动窗口思想,搞清楚左右边界移动条件,维护的变量,什么时候终止遍历
3.当右边界移动到最后时,只能移动左边界,左边界不满足移动条件时,返回最终结果
4.Math.min(a,b);取最小值。min=Integer.MAX_VALUE;//初始化一个最大

posted @ 2024-10-26 11:42  南飞小猪  阅读(9)  评论(0)    收藏  举报