algorighm/top-interview-leetcode150/sliding-Window/209长度最小的子数组.js

62 lines
2.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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
}