给定一个正整数数组 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的子数组。
链接:https://leetcode.com/problems/subarray-product-less-than-k/
解题思路:
双指针法,子数组问题最常用的就是双指针法,也可以看作滑动窗口。本题的思路是定义一快一慢两个指针(fast和slow),让快指针(fast)先走,走到乘积大于k时停下来,此时,以fast结尾,以slow到fast之间的数开头的子数组,都是乘积小于k的子数组(数组只含正数),共计fast - slow + 1个,这是解决本题的关键。然后移动slow,直到乘积又小于k。
我的代码:
class Solution(object):
def numSubarrayProductLessThanK(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
# 双指针法
res = 0
slow = fast = 0
cur = 1
while fast < len(nums):
cur *= nums[fast]
while cur >= k and slow <= fast:
cur //= nums[slow]
slow += 1
res += fast - slow + 1
fast += 1
return res
Time: O(N)
Space: O(1)
难度:中等
同类题:209. 长度最小的子数组