一起养成写作习惯!这是我参与「掘金日新计划 · 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)