62 lines
2.3 KiB
JavaScript
62 lines
2.3 KiB
JavaScript
/**
|
||
* https://leetcode.cn/problems/minimum-size-subarray-sum/?envType=study-plan-v2&envId=top-interview-150
|
||
* @param {number} target
|
||
* @param {number[]} nums
|
||
* @return {number}
|
||
*/
|
||
const minSubArrayLen = function (target, nums) {
|
||
|
||
};
|
||
|
||
/*
|
||
题目要求我们找到最短的子数组,子数组就是原数组中连续的某部分,我们先遍历原数组,之后在遍历到的位置开始往下遍历,并且求和
|
||
如果结果大于等于target就返回这个长度
|
||
*/
|
||
function f1(target, nums) {
|
||
let minLen = Infinity; // 初始化最小长度
|
||
for (let left = 0; left < nums.length; left++) {
|
||
let sum = 0; // 保存当前子数组的和
|
||
for (let right = left; right < nums.length; right++) {
|
||
sum += nums[right];
|
||
if (sum >= target) {
|
||
minLen = Math.min(minLen, right - left + 1);
|
||
// 后面匹配的结果都会符合sum>=target但是一定比当前子数组长,所以直接break
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return minLen === Infinity ? 0 : minLen; // 注意清理初始化的值,如果没有符合要求的,返回0,而不是Infinity
|
||
}
|
||
|
||
function f2(target, nums) {
|
||
let minLen = Infinity; // 初始化最小长度
|
||
let left = 0; // 滑动窗口的左边界
|
||
let sum = 0; // 滑动窗口中所有值的和
|
||
for (let right = 0; right < nums.length; right++) {
|
||
sum += nums[right];
|
||
while (sum >= target) {
|
||
minLen = Math.min(minLen, right - left + 1);
|
||
// 如果靠近right的数值很大,靠近left的数值很小,会造成数组长度很长所以要从左缩小窗口
|
||
sum -= nums[left];
|
||
left++;
|
||
}
|
||
}
|
||
return minLen === Infinity ? 0 : minLen; // 注意清理初始化的值,如果没有符合要求的,返回0,而不是Infinity
|
||
}
|
||
|
||
function f3(target, nums) {
|
||
let minLen = Infinity; // 初始化最小长度
|
||
let left = 0; // 滑动窗口的左边界
|
||
let sum = 0; // 滑动窗口中所有值的和
|
||
for (let right = 0; right < nums.length; right++) {
|
||
sum += nums[right];
|
||
while (sum >= target) {
|
||
minLen = Math.min(minLen, right - left + 1);
|
||
// 如果靠近right的数值很大,靠近left的数值很小,会造成数组长度很长所以要从左缩小窗口
|
||
sum -= nums[left];
|
||
left++;
|
||
}
|
||
}
|
||
return minLen === Infinity ? 0 : minLen; // 注意清理初始化的值,如果没有符合要求的,返回0,而不是Infinity
|
||
}
|