Given an array of integers nums and an integer k, return the number of contiguous subarrays where the product of all the elements in the subarray is strictly less than k.
Example 1:
Input: nums = [10,5,2,6], k = 100
Output: 8
Explanation: The 8 subarrays that have product less than 100 are:
[10], [5], [2], [6], [10, 5], [5, 2], [2, 6], [5, 2, 6]
Note that [10, 5, 2] is not included as the product of 100 is not strictly less than k.
Example 2:
Input: nums = [1,2,3], k = 0
Output: 0
思路:使用滑动窗口的思路,找取每一个符合条件的小窗,统计其内部子数组数量。
注意,对于某一个值,我们只关注以它为最右边元素的子数组。这样可以减少重复讨论的麻烦。
python
class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
if k <= 1: return 0
left, right, multi, ans = 0, 0, 1, 0
while right < len(nums):
multi *= nums[right] # 以右侧元素为pivot
while multi >= k: # 找到对应这个pivot的最长窗口左侧点
multi //= nums[left]
left += 1
ans += right - left + 1 # 统计以pivot为右侧元素的子数组
right += 1
return ans