[LeetCode209题长度最小的子数组] | 刷题打卡

881 阅读2分钟

前言

这里是之前的刷题打卡记录,大家有兴趣的可以看下,如果有什么不同的见解和看法或者觉得有什么错误的,欢迎在评论区留言!🙏🙏🙏

[LeetCode0303题区域和检索 - 数组不可变] | 刷题打卡

[LeetCode1200. 最小绝对差] | 刷题打卡

[LeetCode0304题二维区域和检索 - 矩阵不可变] | 刷题打卡

[LeetCode11题盛最多水的容器] | 刷题打卡

[LeetCode0338题比特位计数] | 刷题打卡

题目描述

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5  

进阶:

如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

解题思路

题目给定含有n个正整数的数组nums和一个正整数s,要求找出数组中满足 和 >= s的长度最小的连续子数组。

首先设定一个minLen作为子数组的和,因为是求长度最小,所以minLen设为最大用来做比较。

子数组的和即子数组左端left和右端right之间的元素和sum

right向右朝着nums的右端移动,移动的过程中计算leftright之间的和sum

如果sum >= s,那么这个时候就已经满足了题目的要求和 >= s,这个时候就不需要继续向右移动right了,因为题目要求的是长度最小,已经满足条件了还继续向右就背离了题目的要求,没有意义了。

满足了和 >= s的条件,现在就需要去满足第二个条件长度最小,在满足第一个条件的情况下,去向右移动left,每次比较当前和上一次的满足条件的子数组的长度minLen,保留最小的,以此类推。

最后如果minLen还是预设的最大值的话就说明没有满足条件的子数组,返回0,反之返回满足条件的minLen

解题代码

var minSubArrayLen = function(s, nums) {
    let minLe = Number.MAX_SAFE_INTEGER;
    let left = 0, right = 0, sum = 0;
    while (right < nums.length) {
        sum += nums[right];
        while(sum >= s) {
            minLe = Math.min(minLe, right-left+1);
            sum -= nums[left];
            left++
        }
        right++;
    }
    return minLe == Number.MAX_SAFE_INTEGER ? 0 : minLe;
}

总结

多写写题解还是很有必要的,不要怕写的不好,敢写就已经很不错了,写的过程就是回顾的过程,更容易加深自己的理解。

加油!hxdm!!!💪💪💪

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情