长度最小的子数组

269 阅读1分钟

长度最小的子数组

209 长度最小的子数组

暴力法:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        //最终结果
        int result = Integer.MAX_VALUE;
        //子数组之和
        int sum = 0;
        //子数组长度
        int sublen = 0;
        //两个for循环遍历,当连续子数组的和大于等于target时,且子数组长度为最小值时则更新子数组长度
        for(int i = 0; i < nums.length; i ++) {
            sum = 0;
            for(int j = i; j < nums.length; j ++) {
                sum += nums[j];
                if(sum >= target) {
                    sublen = j - i + 1;
                    result = result > sublen ? sublen : result;
                    break;
                }
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

滑动窗口法:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        //最终结果
        int result = Integer.MAX_VALUE;
        //滑动窗口数值之和
        int sum = 0;
        //滑动窗口长度
        int sublen = 0;
        //滑动窗口起始位置
        int i = 0;
        for(int j = 0; j < nums.length; j++) {
           sum += nums[j];
           //不断比较子数组是否符合条件
           while(sum >= target) {
               sublen = j - i + 1;
               result = result > sublen ? sublen : result;
               //不断变更滑动窗口起始位置
               sum -= nums[i++];
           }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}