
求解代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public int numSubarrayProductLessThanK(int[] nums, int k) {
int cur = 1;
int left = 0;
int right = 0;
int res = 0;
// 每次循环都在考虑:以 right 为右边界的所有满足条件的子数组
while (right < nums.length) {
// 把 nums[right] 包含进来
cur *= nums[right];
// 调整左边界,保证窗口乘积 < k
while (left <= right && cur >= k) {
// 从窗口中移除 nums[left]
cur /= nums[left];
// 左边界右移,缩小窗口
left++;
}
// 计算以 right 为右边界的满足条件的子数组个数
res += (right - left + 1);
// 右指针右移,准备处理下一个右边界
right++;
}
return res;
}
|
小贴士
关键在于以 right 为结尾的、乘积 < k 的子数组有right - left + 1 个