我写了一个函数,返回arr中连续元素的子数组的minLength,其中总和大于num.在我自己的解决方案中,我没有脱离我需要的循环;但是,我仍然不明白为什么我需要脱离这个循环。
//returns the minlen of the contiguous subarray which sum is greater than or equal to the num
function minSubArrayLen(arr, num){
//define variables
let total = 0;
let start = 0;
let end = 0;
let minLen = Infinity;
while (start < arr.length){
//when total is less then the num increase end and add it to the total
if (total < num && end < arr.length){
total += arr[end];
end++;
//when total is larger than the num start looping from the next start and subtract the previous start from the total
} else if (total >= num){
minLen = Math.min(minLen, (end - start));
total -= arr[start];
start++;
//need to break because
} else {
break;
}
}
return minLen === Infinity ? 0: minLen;
}
//test
console.log(minSubArrayLen([1,2,3,4,5], 200));
console.log(minSubArrayLen([5,2,3,1,6], 7));
console.log(minSubArrayLen([1,2,20,4,10], 20));
对于第一组输入,你的 total
(函数的第二个参数)大于数组元素的实际总数。你的前两个条件不足以处理这组输入。
根据输入的情况,你的循环只进入了第一个条件的内部,而且只进入了 end
变量变化。start
不改变,因为 total
永远不大于或等于 num
.
你的while循环取决于 start
从不在if块中修改,所以重复while循环的条件总是评价为true。一旦 if
条件对第一组参数不为真,则 else if
条件也不成立,所以如果没有 else { break; }
它进入了一个无限循环。
你可以通过改进进入 while 循环的测试来解决这个问题,使它依赖于在循环中修改的变量。