代码随想录-数组4-长度最小的子数组

方法一:暴力解法双循环,据说会被力扣判断超时

方法二:滑动窗口(类似双指针)

class Solution {

    // 滑动窗口
    public int minSubArrayLen(int s, int[] nums) {
        int left = 0;
        int sum = 0;
        //关于这里为什么最好不用nums.length作为result初始化的值:
        //如果不存在满足条件的子数组,那result的值就不会被修改,仍然是nums.length
        //如果满足条件的最小子数组就是nums[]本身,那result的值还是nums.length
        //所以,int result = nums.length的做法会让返回值有很大的欺骗性,需要额外做一次判断区分这两种情况

        //----我曾经考虑过,看着Integer.MAX_VALUE心里不舒服的话,初始值可以用nums.length+1,
        //----但是对于一个很长的数组,我们不输出nums.length的话,其实nums.length+1的结果欺骗性还是很大,
        //----需要额外加个if语句判断result是否小于nums.length+1,满足才是合法输出
        //----为了省事还是用Integer.MAX_VALUE好了
        int result = Integer.MAX_VALUE;
        for (int right = 0; right < nums.length; right++) {
            sum += nums[right];
            while (sum >= s) {
                //比较窗口滑动之后的子数组长度是否变小
                result = Math.min(result, right - left + 1);
                sum -= nums[left++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

        关于这里为什么最好不用nums.length作为result初始化的值:

        如果不存在满足条件的子数组,那result的值就不会被修改,仍然是nums.length。如果满足条件的最小子数组就是nums[]本身,那result的值还是nums.length。

        所以,int result = nums.length的做法会让返回值有很大的欺骗性,需要额外做一次判断区分这两种情况。我曾经考虑过,看着Integer.MAX_VALUE心里不舒服的话,初始值可以用nums.length+1,但是对于一个很长的数组,我们不输出nums.length的话,其实nums.length+1的结果欺骗性还是很大,需要额外加个if语句判断result是否小于nums.length+1,满足才是合法输出为了省事还是用Integer.MAX_VALUE好了。

方法二(犟驴版之我就不想用MAX_VALUE)

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int right = 0;
        int result = nums.length+1;
        int sum = 0;

        for(;right<nums.length;right++){
            sum += nums[right];
            //考虑窗口右移一位之后左侧可能会移动好几位,所以这里用while循环而不是if
            //比如[1,1,1,1,100] target = 100的情况
            while(sum>=target){
                // 更新子数组长度
                result = result > (right-left+1) ? (right-left+1) : result;
                //result = Math.min(result,right-left+1);

                //右移左指针
                sum = sum -nums[left];
                left++;
                //sum -= nums[left++];

            }
        }
        return result < nums.length + 1 ? result:0;
    }
}

result 初始化为nums.length+1代码可读性可能不如MAX_VALUE,但是自己想出来的东西应该会记得更牢一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值