这个题解采用了滑动窗口的策略来找出所有乘积小于 k 的子数组。首先,定义一个变量 prod 来存储当前窗口内所有元素的乘积,和一个计数器 count 来统计符合条件的子数组数目。遍历数组 nums,使用一个右指针 right 表示当前窗口的右边界。对于每一个新的 right,将 nums[right] 乘到 prod 上。如果 prod 大于或等于 k,则移动左指针 left 直到 prod 小于 k。每次找到有效的窗口后,可以通过 right-left+1 计算出新添加的子数组数量,因为每扩展一次右边界,就会增加从 left 到 right 的所有连续子数组。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
if k <= 1:
return 0 # 当 k 小于等于 1 时,没有有效的子数组
count = 0 # 计数符合条件的子数组数量
left = 0 # 左指针
prod = 1 # 用于计算当前窗口内所有元素的乘积
for right in range(len(nums)):
prod *= nums[right] # 将当前元素乘到 prod 上
while prod >= k and left <= right:
prod //= nums[left] # 如果 prod 大于等于 k,移动左指针,并更新 prod
left += 1
count += right - left + 1 # 计算包括当前右指针元素的新子数组数量
return count # 返回总数