要解决“乘积小于 k 的子数组”问题,可以使用滑动窗口技术。下面是详细的步骤和思路:
-
初始化变量:
- 定义两个指针
left
和right
,都初始化为 0,用于表示窗口的左右边界。 - 一个
product
变量初始化为 1,用于存储当前窗口内的乘积。 - 一个
count
变量用于记录符合条件的子数组数目。
- 定义两个指针
-
扩展右指针:
- 遍历数组,逐步移动
right
指针,更新product
,将当前right
指向的元素乘到product
中。
- 遍历数组,逐步移动
-
收缩左指针:
- 当
product
大于或等于k
时,移动left
指针,逐步将窗口左侧元素移出,直到product
小于k
。同时每次更新product
,通过除以移出的元素。
- 当
-
计数子数组:
- 如果当前
product
小于k
,那么从left
到right
之间的所有子数组都是有效的。有效的子数组数目为right - left + 1
。
- 如果当前
-
返回结果:
- 遍历完成后,返回
count
。
- 遍历完成后,返回
代码示例(Python):
def num_subarray_product_less_than_k(nums, k):if k <= 1:return 0count = 0product = 1left = 0for right in range(len(nums)):product *= nums[right]while product >= k:product /= nums[left]left += 1count += right - left + 1 # Count subarrays ending at rightreturn count# 示例
nums1 = [10, 5, 2, 6]
k1 = 100
print(num_subarray_product_less_than_k(nums1, k1)) # 输出: 8nums2 = [1, 2, 3]
k2 = 0
print(num_subarray_product_less_than_k(nums2, k2)) # 输出: 0
解释:
- 在第一个示例中,除了单个元素外,还有多个组合的乘积小于
100
,总共的有效子数组数量为8
。 - 第二个示例中,因为乘积不可能小于
0
,所以返回0
。
通过这种方法,我们可以高效地计算出符合条件的子数组数量。