leetcode209. 长度最小的子数组

链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/
思路

  创建两个数组索引 L(左),R(右),每次比较两索引之间的值和是否大于s,如果大于等于s,记录当前最小满足条件长度,并将L索引+1。如果小于s,则将R索引+1,使用while循环。事件复杂度为O(n)结果代码如下:

public int minSubArrayLen(int s, int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int l = 0;
        int r = 0;
        int min = Integer.MAX_VALUE;
        int num=nums[l];
        while (r < nums.length) {
            System.out.println(min);
            if (num >= s) {
                min = min > r - l+1 ? r - l+1 : min;
                num-=nums[l];
                l++;
            }else if (r<nums.length-1){
                r++;
                num+=nums[r];
            }else {
                r++;
            }
        }
        if (min==Integer.MAX_VALUE){
            return 0;
        }else {
            return min;
        }
    }

运行通过
在这里插入图片描述

官方题解

  官方题解:双指针和我的思路一致,只不过官方实现方法更简洁,利用while嵌套,外层while判断是否end索引循环到数组末端,内层while判断当前索引是否满足条件。值得我们学习的代码:

public int minSubArrayLen(int s, int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int ans = Integer.MAX_VALUE;
        int start = 0, end = 0;
        int sum = 0;
        while (end < n) {
            sum += nums[end];
            while (sum >= s) {
                ans = Math.min(ans, end - start + 1);
                sum -= nums[start];
                start++;
            }
            end++;
        }
        return ans == Integer.MAX_VALUE ? 0 : ans;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值