欣迪

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

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)

訂閱 IT-Monk

訂閱最新文章的發布消息! 😚😚😚
Loading

作者介紹 - 欣迪

欣迪

從設計到寫程式,發現自己有追求前端技巧的自虐傾向。不斷的踩坑,再從坑裡爬出來,慢慢對攀岩有點心得。 目前在多間公司擔任網站設計顧問。 同時也是網站架設公司負責人。