0713. 乘积小于K的子数组 #
- 标签:数组、滑动窗口
- 难度:中等
题目大意 #
描述:给定一个正整数数组 nums
和整数 k
。
要求:找出该数组内乘积小于 k
的连续的子数组的个数。
说明:
- $1 \le nums.length \le 3 * 10^4$。
- $1 \le nums[i] \le 1000$。
- $0 \le k \le 10^6$。
示例:
- 示例 1:
|
|
- 示例 2:
|
|
解题思路 #
思路 1:滑动窗口(不定长度) #
- 设定两个指针:
left
、right
,分别指向滑动窗口的左右边界,保证窗口内所有数的乘积window_product
都小于k
。使用window_product
记录窗口中的乘积值,使用count
记录符合要求的子数组个数。 - 一开始,
left
、right
都指向0
。 - 向右移动
right
,将最右侧元素加入当前子数组乘积window_product
中。 - 如果
window_product >= k
,则不断右移left
,缩小滑动窗口长度,并更新当前乘积值window_product
直到window_product < k
。 - 记录累积答案个数加
1
,继续右移right
,直到right >= len(nums)
结束。 - 输出累积答案个数。
思路 1:代码 #
|
|
思路 1:复杂度分析 #
- 时间复杂度:$O(n)$。
- 空间复杂度:$O(1)$。