长度最小的子数组

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!

长度最小的子数组_第1张图片

function minSubArrayLen(target, nums) {
    const n = nums.length;
    // 初始化最小子数组长度为一个较大的值,用于后续比较更新
    let minLength = Infinity;
    // 初始化当前子数组的起始位置
    let start = 0;
    // 初始化当前子数组的元素总和
    let sum = 0;

    // 遍历数组,作为子数组的结束位置
    for (let end = 0; end < n; end++) {
        // 将当前元素累加到总和中
        sum += nums[end];

        // 当总和大于等于目标值时
        while (sum >= target) {
            // 计算当前子数组的长度
            const currentLength = end - start + 1;
            // 更新最小子数组长度
            minLength = Math.min(minLength, currentLength);
            // 尝试缩小子数组,将起始位置右移,并从总和中减去起始位置的元素
            sum -= nums[start];
            start++;
        }
    }

    // 如果最小子数组长度仍为 Infinity,说明不存在符合条件的子数组,返回 0
    return minLength === Infinity ? 0 : minLength;
}

// 测试示例
const target1 = 7;
const nums1 = [2, 3, 1, 2, 4, 3];
console.log(minSubArrayLen(target1, nums1)); 

const target2 = 4;
const nums2 = [1, 4, 4];
console.log(minSubArrayLen(target2, nums2)); 

代码解释

整体思路
本题可以使用滑动窗口的方法来解决。滑动窗口是一种常用的算法技巧,通过维护一个可变大小的窗口,在数组或字符串上进行操作。在本题中,我们使用一个滑动窗口来表示子数组,通过不断移动窗口的起始和结束位置,找到满足总和大于等于目标值的最小子数组长度。

代码步骤分析

初始化变量:

  • n:数组的长度。
  • minLength:初始化为 Infinity,用于记录满足条件的最小子数组长度。
  • start:滑动窗口的起始位置,初始为 0。
  • sum:当前滑动窗口内元素的总和,初始为 0。

遍历数组:

  • 使用 for 循环遍历数组,end 作为滑动窗口的结束位置。
  • 在每次循环中,将当前元素 nums[end] 累加到 sum 中。 调整窗口:
  • 当 sum 大于等于 target 时,说明当前窗口内的子数组满足条件。
  • 计算当前子数组的长度 currentLength,并更新 minLength 为 minLength 和 currentLength
    中的较小值。
  • 尝试缩小窗口,将 start 右移一位,并从 sum 中减去 nums[start],继续判断新的窗口是否满足条件。

返回结果:

  • 遍历结束后,如果 minLength 仍为 Infinity,说明不存在符合条件的子数组,返回 0;否则返回 minLength。

你可能感兴趣的:(150道经典算法面试习题,javascript,数据结构,算法)