题目来源:https://leetcode-cn.com/problems/ZVAVXX/
大致题意:
给一个数组和整数 k,求出数组中乘积小于 k 的子数组的个数
思路
- 使用滑动窗口表示当前的子数组,在更新窗口边界过程中确定子数组个数
可以知道,如果滑动窗口当前长度为 l,若当右边界 + 1 后整体乘积仍小于 k,那么在当前已经遍历到的范围内,乘积小于 k 的子数组的数量将会增加 l + 1 ,也就是当前的窗口长度。道理很简单,以新加入的元素为右边界,之前窗口内所有元素为子边界,都是新增的乘积小于 k 的子数组
代码:
public int numSubarrayProductLessThanK(int[] nums, int k) {
int n = nums.length;
int l = 0; // 初始窗口左边界
int r = 0; // 初始窗口右边界
int product = 1; // 初始乘积
int ans = 0;
while (r < n) {
// 更新窗口乘积
product *= nums[r];
// 若乘积大于 k,更新左边界
while (l <= r && product >= k) {
product /= nums[l];
l++;
}
// 若当前窗口仍存在,则窗口乘积小于 k,更新答案
if (l <= r) {
int len = r - l + 1;
ans += len;
}
r++;
}
return ans;
}