算法练习第26题-长度最小的子数组

150 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

一、题目

定一个含有 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

作者:力扣 (LeetCode)

链接:leetcode-cn.com/leetbook/re…

来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、思路

  • 双指针
    • 这个问题的难点在于,我们叠加完第一个大于等于target的值后,如何进行第二次叠加
    • 首先定义长度len,快慢指针right, left, 叠加值totalNum 最大长度minLen,因为要找最小长度,因此minLen = len + 1
    • 通过while循环,totalNum的值就是比较的叠加值 totalNum += nums[right++]
    • 当totalNum大于target的时候
    • 进入第二层循环,这是比较最大长度
    • 如果minLen > right - left? right - left : minLen
    • 这是minLen是最小的长度
    • 然后进行第二次循环,要触犯第二次循环的条件是totalNum < target
    • 那么这时,可以在第二层循环中使用totalNum -= nums[left++]
    • 这样就可以依次递归,进入外层循环了,运行到最后找到最小长度
    • 这里要考虑一种情况就是所有值相加都不满足条件
    • 如果全部长度相加依然不满足条件的话,就要返回0
    • 因此最后的return值应该是minLen > len ? 0 : minLen

三、 代码

let target = 7, nums = [2,3,1,2,4,3]
let minSubArrayLen = function(target, nums) {
  let len = nums.length, left = 0, right = 0, totalNum = 0, minLen = len + 1
  /**
   * 双指针
   * 这个问题的难点在于,我们叠加完第一个大于等于target的值后,如何进行第二次叠加
   * 
   * 首先定义长度len,快慢指针right, left, 叠加值totalNum 最大长度minLen,因为要找最小长度,因此minLen = len + 1 
   * 
   * 通过while循环,totalNum的值就是比较的叠加值 totalNum += nums[right++]
   * 
   * 当totalNum大于target的时候
   * 进入第二层循环,这是比较最大长度
   * 如果minLen > right - left? right - left : minLen
   * 这是minLen是最小的长度
   * 然后进行第二次循环,要触犯第二次循环的条件是totalNum < target
   * 那么这时,可以在第二层循环中使用totalNum -= nums[left++]
   * 这样就可以依次递归,进入外层循环了,运行到最后找到最小长度
   * 
   * 这里要考虑一种情况就是所有值相加都不满足条件
   * 如果全部长度相加依然不满足条件的话,就要返回0
   * 因此最后的return值应该是minLen > len ? 0 : minLen
   * */ 

  while(right < len) {
    totalNum += nums[right++]
    while(totalNum >= target) {
      minLen = minLen > right - left ? right - left: minLen
      totalNum -= nums[left++]
    }
  }
  return minLen > len ? 0 : minLen
  
}
minSubArrayLen(target, nums)

四、测试结果

image.png