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