滑动窗口:
- 如果两个指针之间的子数组中数字的乘积大于等于k,则向右移动left指针;
- 如果两个指针之间的子数组中数字的乘积小于k,则向右移动right指针;
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
if (nums.empty()) return 0;
int count = 0;
int left = 0;
int curProduct = 1;
for (int right = 0; right < nums.size(); ++ right)
{
curProduct *= nums[right];
while (left <= right && curProduct >= k)
{
curProduct /= nums[left ++ ]; //一边向右移动左指针,一边减少乘积
}
//一旦左指针向右移动到某个位置时子数组乘积小于k,就不需要在继续移动了
//因为继续向右移动形成的子数组之积必定也小于k
//此时两个指针之间有多少个数字,就找到了多少个数字乘积小于k的子数组
count += right - left + 1;
}
return count;
}
};