揭开滑动窗口的神秘面纱,征服 713. 乘积小于 K 的子数组
2023-09-23 17:54:52
在算法的世界中,滑动窗口技巧犹如一把锋利的手术刀,它能精妙地从数据流中分离出有价值的信息。它广泛应用于众多算法问题中,其中一个经典的应用就是解决 leetcode 上的 713. 乘积小于 K 的子数组。
本文将带你深入探究滑动窗口的奥秘,并通过拆解 713. 乘积小于 K 的子数组 这道题,手把手教你如何运用滑动窗口技巧,轻松斩获算法难题。
什么是滑动窗口?
滑动窗口是一种遍历数据流的技巧,它通过一个固定大小的窗口在数据流中移动,每次移动一个单位,从而逐一处理数据流中的元素。滑动窗口的优势在于它能够在时间和空间效率上取得平衡,避免对整个数据流进行不必要的遍历。
713. 乘积小于 K 的子数组
这道题目要求我们计算一个整数数组中,所有乘积小于 k 的连续子数组的个数。乍一看,这似乎是一个繁琐的任务,需要遍历数组中的所有可能子数组。然而,滑动窗口技巧为我们提供了更优雅高效的解决方案。
滑动窗口算法步骤
-
初始化滑动窗口: 设置两个指针 left 和 right,分别指向滑动窗口的左边界和右边界,并计算当前窗口内元素的乘积。
-
检查窗口是否满足条件: 如果当前窗口内元素的乘积小于 k,则将窗口右边界 right 向右移动一位,并更新窗口内元素的乘积。
-
统计子数组数量: 如果窗口右边界 right 到达数组末尾,则当前窗口包含一个满足条件的子数组,将子数组数量加 1。
-
移动滑动窗口: 将窗口左边界 left 向右移动一位,并更新窗口内元素的乘积。
-
重复步骤 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 的子数组 这类问题,更能让你在其他算法难题中游刃有余。滑动窗口技巧就像一把神奇的钥匙,开启了算法世界的大门,带你领略算法的魅力。