为了能到远方,脚下的每一步都不能少.|

TranquilGlow

园龄:2年7个月粉丝:1关注:0

2023-07-10 16:50阅读: 11评论: 0推荐: 0

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;
    }
}

本文作者:TranquilGlow

本文链接:https://www.cnblogs.com/xuehaiqiule/p/17621634.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   TranquilGlow  阅读(11)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起