今日题目
今天LeetCode每日一题:713.乘积小于 K 的子数组【难度:中等】
给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
例如
输入: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 的子数组。
题目解读
输入数据:
nums: List[int]
k: int
题目要求:
找到满足下列条件的nums子数组:
- 从属于nums,且元素在nums中连续
- 所有元素的乘积小于 k
计算满足条件的nums子数组的数量
算法思想
双指针滑动窗口
设置两个指针 left 和 right,初始位置均 0 ;设置元素连续 乘积 mul,初始值为1
用right遍历数组,每一次遍历 累乘 经过的元素得到mul
left与right之间的区域则为有效滑动窗口,其元素乘积小于k
如果mul大于 k 了,则left右移,mul=mul/nums[left],保证窗口内元素乘积mul小于k
每个滑动窗口增加的连续元素组合数目count=right-left+1
代码实现
class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
if k<=1:
return 0
res, mul, left = 0, 1, 0
for right, num in enumerate(nums):
mul *= num
while mul >= k:
mul /= nums[left]
left+=1
res += right-left+1
return res
如果要在我们自己的编辑器里实现,则要完善一下引包以及main函数的实现