输入: 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的子数组。
能用滑动窗口,主要是因为右指针向右移动时,肯定不会变小(特殊值1);左指针向右移动时,肯定不会变大;符合单调。
还要注意用必须包含右指针,保证子数组不重复
class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
if k < 2:
return 0
num = 0
# 双指针法
# 要求必须包含右指针(可以避免子数组重复)
l = 0
r = 0
multi = nums[l]
if multi < k:
num += (r - l + 1)
# print('r:', r)
# print(num)
while r + 1 < len(nums):
# print('r:', r+1)
# r向右移动1位
r = r + 1
multi *= nums[r]
while multi >= k and l < r:
multi /= nums[l]
l = l + 1
# print('l, r:',l, r)
if multi < k:
num += (r - l + 1)
# print(num)
return num