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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数组排序可以使用冒泡排序算法进行手写实现。冒泡排序是一种基础的排序算法,其基本思想是通过比较相邻元素的大小,将较大的元素逐渐交换到数组的末尾,从而实现排序的目的。 下面是使用JavaScript语言实现冒泡排序的代码示例: ```javascript function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len - 1; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j > arr[j + 1]) { var temp = arr[j]; arr[j = arr[j + 1]; arr[j + 1 = temp; } } } return arr; } // 示例用法 var arr = [3, 1, 5, 2, 4]; var sortedArr = bubbleSort(arr); console.log(sortedArr);``` 在上述代码中,我们首先定义了一个名为`bubbleSort`的函数,该函数接受一个数组作为参数。接着,我们使用两个嵌套的`for`循环来实现冒泡排序的逻辑。在外层循环中,我们控制排序的轮数,每一轮确定一个最大的元素。在内层循环中,我们比较相邻的两个元素大小,若前者大于后者,则交换它们的位置。最终,经过`n-1`轮的排序,数组中的元素就完成了排序。 对于输入的示例数组`[3, 1, 5, 2, 4]`,经过冒泡排序后,得到的排序结果为`[1, 2, 3, 4, 5]`。 请注意,冒泡排序在实际应用中并不是最高效的排序算法,但它是一种很好理解和实现的基础算法。在面试中,掌握冒泡排序的手写实现可以展示你的算法基础功底和对JavaScript语言的熟练程度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [es6 数组排序_JavaScript面经之冒泡排序](https://blog.csdn.net/weixin_39599046/article/details/110414960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值