题目
给定一个含有 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 };