代码随想录 长度最小子数组

问题描述

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

思路解析

主要问题就一个,怎么实现对数组中连着的几个元素进行计算?

和昨天的思路相同,双指针可以完成这个目标。使用双指针的特点是:一个指针遍历,另一个只在满足条件时发生变化。

对于本问题来说,双指针控制的区间内,就是计算的连续元素的区间。我们可以设想这样的场景:

  1. 右指针向前遍历,不断往双指针区间内增加元素;
  2. 左指针在达到某种条件时,也会向前移位。

那么解题思路就比较明了,右指针向前遍历,增加右边元素到区间中;当区间的和大于target的时候,左指针将左边的元素排出,直到区间的和小于target,就再次让右指针添加。

不难发现,该种方法能够使所有的大于target的连续元素通过判断条件。

代码实现

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0, left = 0, right = 0, srtlength = Integer.MAX_VALUE;
        for (right = 0; right < nums.length; right++) {
            sum += nums[right];
            while (sum >= target) {
                srtlength = Math.min (srtlength, right - left + 1);
                sum -= nums[left];
                left++;
            }
        }
        return srtlength == Integer.MAX_VALUE ? 0 : srtlength;
    }
}

整体比较简单,但是对于本菜鸡来说,有几个需要注意的点:

  1. Integer.MAX_VALUE 理论上最大的数;
  2. Math.min 取小函数;
  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值