顧名思義,是一個滑動的視窗。常用來處理陣列中連續連續發生的情形。例如: 給定一個數字的,求給定數組中的最大子數組和。
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)
