开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情
题目
给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
输出:false
解释:总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。
思路一
我们进入函数后先做判断,如果当前形参nums为null或者形参nums的长度为0或者形参target小于等于0,我们就直接返回0,否则我们就继续往下执行,往下执行我们新建result变量,默认值为Number的最大值,然后再新建三个变量,分别是sum变量,i变量和j变量,他们的初始值都默认为0,然后使用for循环进行循环形参nums,在for循环中我们在嵌套了一层while循环,循环条件为,当前j变量小于形参nums的长度且sum变量小于形参target时就进行循环,否则就终止循环,在while循环中我们将sum变量和当前形参nums的j变量位置值进行累加病重新赋值给sum变量,并且在让j变量进行自增1,然后进行判断如果sum变量大于等于形参target则将result变量值更新为result变量和j- i中的最小值,然后再将sum变量和当前nums形参i变量位置值相减,并重新赋值给sum变量,最后我们判断当前result变量是不是Number中的最大值,如果是相等那么就返回0,如果不是则将result变量返回出去即可
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
if (nums == null || nums.length === 0 || target <= 0) {
return 0
}
let result = Number.MAX_VALUE
let sum = 0
let i = 0
let j = 0
for (i = 0; i < nums.length; i++) {
while (j < nums.length && sum < target) {
sum += nums[j]
j++
}
if (sum >= target) {
result = Math.min(result, j - i)
}
sum -= nums[i]
}
return result === Number.MAX_VALUE ? 0 : result
};