乘积小于K的子数组
思路
该算法通过滑动窗口来解决问题,核心思想是维护一个窗口,窗口内的元素乘积始终小于给定的 k。具体步骤如下:
1.初始化 left 指针和 cal(窗口内元素的乘积),count 用于记录符合条件的子数组个数。
2.使用 right 指针遍历整个数组,扩展窗口。
3.每次扩展窗口时,将当前 right 指针所指的元素乘到 cal 中。
4.如果窗口内的乘积大于或等于 k,通过移动 left 指针(即缩小窗口)直到窗口内的乘积小于 k。
5.对于每个 right 指针的位置,所有从 left 到 right 的子数组都是合法的,加入到 count 中。
class Solution:def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:if k<=1:return 0 #这个一定要加上,因为数组都是正数,小于1的没有if not nums:return 0cal=1count=0left=0for right in range(len(nums)):cal=cal*nums[right] #cal表示当前[left,right]窗口内的乘积while cal>=k:cal=cal//nums[left]left+=1 #不断移动左边界count+=(right-left+1)return count