给定一个正整数数组 nums
。
找出该数组内乘积小于 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的子数组。
说明:
0 < nums.length <= 50000
0 < nums[i] < 1000
0 <= k < 10^6
双指针法
涉及到连续子数组问题,双指针滑窗法!
class Solution(object):
def numSubarrayProductLessThanK(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
# 双指针法 计算i,j之间的满足条件的连续子数组个数
if k==0 or k==1:return 0
n,i=0,0
mul=1
for j in range(len(nums)):
mul*=nums[j]
while mul>=k:
mul//=nums[i]
i+=1
# 加入当前元素后增加的乘积为k的连续子数组个数为j-i+1
n+=j-i+1
return n