返回

揭开滑动窗口的神秘面纱,征服 713. 乘积小于 K 的子数组

后端

在算法的世界中,滑动窗口技巧犹如一把锋利的手术刀,它能精妙地从数据流中分离出有价值的信息。它广泛应用于众多算法问题中,其中一个经典的应用就是解决 leetcode 上的 713. 乘积小于 K 的子数组。

本文将带你深入探究滑动窗口的奥秘,并通过拆解 713. 乘积小于 K 的子数组 这道题,手把手教你如何运用滑动窗口技巧,轻松斩获算法难题。

什么是滑动窗口?

滑动窗口是一种遍历数据流的技巧,它通过一个固定大小的窗口在数据流中移动,每次移动一个单位,从而逐一处理数据流中的元素。滑动窗口的优势在于它能够在时间和空间效率上取得平衡,避免对整个数据流进行不必要的遍历。

713. 乘积小于 K 的子数组

这道题目要求我们计算一个整数数组中,所有乘积小于 k 的连续子数组的个数。乍一看,这似乎是一个繁琐的任务,需要遍历数组中的所有可能子数组。然而,滑动窗口技巧为我们提供了更优雅高效的解决方案。

滑动窗口算法步骤

  1. 初始化滑动窗口: 设置两个指针 left 和 right,分别指向滑动窗口的左边界和右边界,并计算当前窗口内元素的乘积。

  2. 检查窗口是否满足条件: 如果当前窗口内元素的乘积小于 k,则将窗口右边界 right 向右移动一位,并更新窗口内元素的乘积。

  3. 统计子数组数量: 如果窗口右边界 right 到达数组末尾,则当前窗口包含一个满足条件的子数组,将子数组数量加 1。

  4. 移动滑动窗口: 将窗口左边界 left 向右移动一位,并更新窗口内元素的乘积。

  5. 重复步骤 2-4: 重复步骤 2-4,直至窗口左边界 left 遍历完整个数组。

代码实现

def numSubarrayProductLessThanK(nums, k):
    if not nums or k <= 0:
        return 0

    left = right = res = 0
    prod = 1

    while right < len(nums):
        prod *= nums[right]

        while prod >= k and left <= right:
            prod /= nums[left]
            left += 1

        res += right - left + 1
        right += 1

    return res

总结

通过本文的讲解,相信你已经掌握了滑动窗口技巧的精髓。它不仅能帮助你解决 leetcode 上的 713. 乘积小于 K 的子数组 这类问题,更能让你在其他算法难题中游刃有余。滑动窗口技巧就像一把神奇的钥匙,开启了算法世界的大门,带你领略算法的魅力。