一文搞懂长度最小的子数组

LeetCode链接

题目:给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组并返回其长度。如果不存在符合条件的子数组,返回 0。

分析题意:有一个正整数数组和正整数s,寻找数组中一个连续子数组其和要满足≥ s。

返回结果:连续子数组的长度,如果不存在则返回0;

数组如下:

  • 如果s为100时候,肯定是找不到的。此时结果返回为0,
  • 如果s为7时,首先找到连续子数组[2,3,1,2]->[3,1,2,4]->[1,2,4] ->[4,3]最终返回的结果为2(子数组长度)

过程如下

参数:数组定义为

int[] nums = {2,3,1,2,4,3};
int target = 7;
// 左右指针用来控制滑动窗口长度
int left = 0;
// 记录窗口长度
int length = 0;
// 记录子数组结果
int result = nums.length + 1;
// 记录子数组之和
int sum = 0;

【外层循环】: for (int right = 0; right < nums.length; right++) {

【第一步】: sum+= nums[right]

      【 内层循环】 循环条件:while(sum >= 7(target)) 

【第二步】:计算legth的长度 = right - left + 1;结果result = Math.(result,length)

【第三步】:因为sum >=7,因此要抛去left所对应的值,此时sum-=num[left],left++;

当外层循环结束后要返回结果集

 return result == nums.length + 1 ? 0:result;

思考:为什么 要这样返回呢?

原因是:

  • 考虑如下情况 nums = [1,1,1,1,1,1,1,1],target = 11;  以至于子数组和sum 永远小于target,此时【外层循环】结束。
  • 说明我们没有找到一个子数组使得其和等于sum 应该返回 0;

可能会有人思考:为什么result的初始值 = num.length + 1呢?

因为:滑动窗口的长度length最大只能为数组长度

所以在result与length中第一次比较时,length 永远小于result,这样就可以更新result的值了

package array;

public class MinSubArrayLen {
    public static void main(String[] args) {
        int[] nums = {2,3,1,2,4,3};
        int target = 7;
        int result = minSubArrayLen(target, nums);
        System.out.println(result);
    }
    public static int minSubArrayLen(int target, int[] nums) {
        // 左右指针用来控制滑动窗口长度
        int left = 0;
        // 记录窗口长度
        int length = 0;
        // 记录子数组结果
        int result = nums.length + 1;
        // 记录子数组之和
        int sum = 0;
        for (int right = 0; right < nums.length; right++) {
            sum += nums[right];
            while (sum >= target) {
                length = right - left + 1;
                result = Math.min(result, length);
                sum -= nums[left];
                left++;
            }
        }
        return result == nums.length + 1 ? 0:result;

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兜兜转转m

一毛钱助力博主实现愿望

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值