713. 乘积小于K的子数组
给定一个正整数数组
nums
和整数 k
。请找出该数组内乘积小于
k
的连续的子数组的个数。示例 1:
输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。 需要注意的是 [10,5,2] 并不是乘积小于100的子数组。
示例 2:
输入: nums = [1,2,3], k = 0 输出: 0
提示:
1 <= nums.length <= 3 * 10
4
1 <= nums[i] <= 1000
0 <= k <= 10
6
通过次数31,672提交次数73,713
法 1 滑动窗口
思路
采用滑动窗口的思路,先扩张窗口,当结果大于k 的时候,收缩窗口,然后就把满足结果的子集个数加进来。
关键是 res += right - left 的这个思路!!
题解
class Solution: def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int: if len(nums) == 1: return 1 if nums[0] < k else 0 if k <= 1: return 0 res = 0 left, right = 0, 0 temp = 1 while right < len(nums): temp *= nums[right] right += 1 while temp >= k: temp /= nums[left] left += 1 # 此刻一定满足 小于 k 了,可以开始计算结果了 # 这里需要加上:新引进nums[right]之后的所有子集个数 # 比如 k = 100, nums = [1, 2, 3,200] # 当 right=3 指向 200, left=0, 时候,temp = 6 # 但 前面 1, 2,都已经加入到结果了,只需要把新来 3 之后 多出来的子集加进去, # 此时多出来的子集一定是包含 3 的, # 此时子集个数为 3个,分别为 {3}{2,3}{1,2,3},恰好是 right - left = 3 res += right - left return res