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,从左指针指向的数字开始判断,若满足条件,则结果res
加1,然后与右指针指向的数字相乘,依次循环;直到不满足,左指针加1,右指针为左指针加1,一直重复到数组结束。(超出时间限制)
方法二:滑动窗口;将窗口内值的乘积记为temp
,若满足条件,则右指针向右移,并将temp
值更新;否则,计算窗口长度作为结果的一部分,并将左指针向右移,更新temp
值。
代码
方法一:
class Solution:
def numSubarrayProductLessThanK(self, nums, k):
left, right, res = 0, 1, 0
while left < len(nums):
tmp = nums[left]
while tmp < k and right < len(nums):
res += 1
tmp *= nums[right]
right += 1
if tmp < k: res += 1
left += 1
right = left + 1
return res
方法二:
class Solution:
def numSubarrayProductLessThanK(self, nums, k):
left, temp, res = 0, 1, 0
for right, num in enumerate(nums):
temp *= num
while left <= right and temp >= k:
temp //= nums[left]
left += 1
res += right - left + 1
return res