leecode209长度最小的子数组——手写详解

滑动窗口解决代码的思路和优化思路——手写版

思路

1c09cdb499cd6707b1c0af6740e84ca6_720.png

优化思路

5f8805b3d4aa9e5ad9c981d39a608f09_720.png

代码分析

通过代码(未优化)

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int fast=0,low =0;
        int sum=nums[low],length=0;
        //排除特殊情况
        if(nums.length==1){
            if(target>nums[0]){
                return 0;
            }else return 1;
        } 
        if(nums[0]>target){
            return 1;
        }
        for(fast =1 ;fast<nums.length;fast++){
            if(sum+nums[fast]<target){
                sum+=nums[fast];
            }else {
                sum+=nums[fast];
                //找出这个length的最小值
                if(low==0){
                    length=fast-low+1;
                }else
                    length=Math.min(length,fast-low+1);
                //对其进行求和
                sum-=nums[low];
                low++;
                if(sum>=target){
                    length=Math.min(length,fast-low+1);
                    if(fast>low){
                        sum-=nums[low];
                        low++;
                        sum-=nums[fast];
                        fast--;
                    }
                }
            }
        }
        return length;
    }
}

优化代码

针对上面的未优化代码我做了专项的优化,让这个代码变得更加简洁,更易懂

public class 长度最小的子数组 {
    public static void main(String[] args) {
        int n;
        Scanner input = new Scanner(System.in);
        System.out.println("请输入数组的长度");
        n=input.nextInt();
        int[] num = new int[n];
        System.out.println("输入数组的元素只能为正数");
        for (int i = 0; i < num.length; i++) {
            num[i]= input.nextInt();
        }
        System.out.println("请输入你要查找的目标值");
        int target = input.nextInt();
        System.out.println(minSubArrayLen(target, num));
    }
    //优化代码
    public static int minSubArrayLen(int target, int[] nums) {
        int fast=0,low =0;
        int sum=0,length=100002; //length要超过这个num.length的范围之后才能不断的进行更新
        //排除特殊情况
        for(fast =0 ;fast<nums.length;fast++){
            sum+=nums[fast];
            if(sum>=target){
                //找出这个length的最小值
                length = Math.min(length,fast-low+1);
                //对其进行求和
                sum-=nums[low];
                low++;  //低速指针前移,让其数组范围缩小
                while (sum>=target){
                    length=Math.min(length,fast-low+1);
                    sum-=nums[low];
                    low++;
                }
            }
        }
        if(length==100002){
            return 0;
        }
        return length;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值