LK209长度最小的子数组

45 阅读1分钟

暴力超时:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int len=nums.length;
        int min=Integer.MAX_VALUE;
        for(int i=0;i<len;i++){
            int sum=0;
            for(int j=i;j<len;j++){
                sum+=nums[j];
                if(sum>=target){
                    if(j-i+1<min){
                        min=j-i+1;
                    }
                    break;
                }
            }
        }
        if(min==Integer.MAX_VALUE)
            min=0;
        return min;
    }
}

滑动窗口错误代码:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int len=nums.length;
        int min=Integer.MAX_VALUE;
        int left=0,right=0;
        int sum=0;
        while(right<len){
            sum+=nums[right++];
            if(sum>=target){
                min=Math.min(min,right-left+1);
                sum-=nums[left++];
            }
        }
        return min==Integer.MAX_VALUE?0:min;
    }
}

这里错在每次判断sun>target之后left++;但是right=len-1的时候循环就结束了,left没有取到最后len-1的情况,距len-1还有第一次得出sum>target时left与right得距离,所以外面循环条件需要改成left<len终止循环

滑动窗口错误代码:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int len=nums.length;
        int min=Integer.MAX_VALUE;
        int left=0,right=0;
        int sum=0;
        while(left<len){
            if(sum>=target){
                min=Math.min(min,right-left+1);
                sum-=nums[left++];
            }
            else if(right==len-1){
                sum-=nums[left++];
            }
            else
                sum+=nums[right++];

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

这里存在两个错误, min=Math.min(min,right-left+1)中不该+1,因为我在sum+nums[right]的时候right++,这里+1会导致结果变大;另外也是因为每次right++,right=len-1时sum还没有+nums[len-1],导致错判结果相当于nums数组最后一位被去掉了; 通过代码:

    public int minSubArrayLen(int target, int[] nums) {
        int len=nums.length;
        int min=Integer.MAX_VALUE;
        int left=0,right=0;
        int sum=0;
        while(left<len){
            if(sum>=target){
                min=Math.min(min,right-left);
                sum-=nums[left++];
            }
            else if(right==len){
                sum-=nums[left++];
            }
            else
                sum+=nums[right++];

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