给定一个正整数数组 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ZVAVXX
【python快速版】思想:双指针滑窗
class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
#算法思想还是和双指针动态滑动窗口
#定义指针start,end
start = end = 0
#定义记录个数count
count = 0
#定义窗口元素相乘积
mulres = 1
#当头指针越界结束,
while start <len(nums):
#尾指针后移记录子数组
while (mulres < k) and (end <len(nums)):
mulres = mulres * nums[end]
if mulres>=k:
break
count +=1
end +=1
#当窗内元素不满足时,滑窗开始置为新的状态
start +=1
end =start
mulres = 1
return count
很明显,窗口回退操作可以优化。
【深入研究】
主要研究的点:1、尾指针移动一次窗口积小于k,子数组不仅增加长子数组,还有新加入的子数组和前面各个元素的顺序排列个数,也相当于当前窗口元素个数。也就是end - start +1个。
class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
#算法思想还是和双指针动态滑动窗口
#定义指针start,end
start = end = 0
#定义记录个数count
count = 0
#定义窗口元素相乘积
mulres = 1
#当头指针越界结束,
while end <len(nums):
#更新窗口中元素积
mulres *= nums[end]
#当窗口内数积>k时,右移start指针,每次移动都会增加 窗口元素个子数组
while (mulres >= k) and (start<=end):
mulres //= nums[start]
start +=1
count += end - start +1
end +=1
return count