顧名思義,是一個滑動的視窗。常用來處理陣列中連續連續發生的情形。例如: 給定一個數字的,求給定數組中的最大子數組和。
function maxSubarraySum(nums, k) { if (nums.length < k) { return "Invalid input"; } let maxSum = 0; let currentSum = 0; // 初始化第一個窗口的和 for (let i = 0; i < k; i++) { maxSum += nums[i]; } currentSum = maxSum; // 遍歷數組,移動滑動窗口並更新最大和 for (let i = k; i < nums.length; i++) { // 新窗口的和 = 前一個窗口的和 + 新加入的元素 - 最左邊元素 currentSum = currentSum + nums[i] - nums[i - k]; // 更新最大和 maxSum = Math.max(maxSum, currentSum); } return maxSum; } // 示例 const nums = [1, 4, 2, 10, 2, 3, 1, 0, 20]; const k = 3; const result = maxSubarraySum(nums, k); console.log(result); // 預期輸出:21(子數組[ 1, 0, 20]的和)
可以衍伸各種應用,離如使用最小的連續陣列,總和超過 22。
function smallestSubarrayExceedingSum(nums, targetSum) { let minLength = Infinity; let currentSum = 0; let start = 0; for (let end = 0; end < nums.length; end++) { currentSum += nums[end]; while (currentSum > targetSum) { // 更新最小子陣列長度 minLength = Math.min(minLength, end - start + 1); // 移動窗口左邊界 currentSum -= nums[start]; start++; } } // 如果沒有找到符合條件的子陣列 if (minLength === Infinity) { return "No subarray found"; } return minLength; } // 示例 const nums = [1, 4, 2, 10, 2, 3, 1, 0, 20]; const targetSum = 22; const result = smallestSubarrayExceedingSum(nums, targetSum); console.log(result); // 預期輸出:4(子陣列[3, 1, 0 , 20]的總和超過 22)