题目
数组Nums中,如果其中某个连续子数组的乘积小于k,求这种子数组的个数。
解题思路
此题和求连续子数组的和大于等于k的题类似,运用双指针法,指针同向而行,即可计算子数组乘积。
- 声明双指针left,right,都指向数组第一个元素。
- 向右移动right指针,累加当前乘积,存入变量product
- 如果乘积大于等于k,则向右移动left,缩小乘积,直到乘积小于k,停止移动。
- 统计当前乘积小于k的数量。由于您是在发现乘积小于k时停止的,那么在子数组nums【left】到【right】的数都会小于k,故乘积的数量等于= right - left + 1;
代码
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
int numbers = 0;
int left = 0;
int product = 1;
for (int right = 0; right < nums.length; right++) {
product = product * nums[right];
while(product >= k && left <= right) {
product /= nums[left++]; // right指针不动,当left指针向右移动,遇到乘积小于k时,则停止向右移动left。
}
numbers += right >= left ? right - left + 1 : 0;
}
return numbers;
}
}
总结
此题和求连续子数组的和大于等于k的题类似,运用双指针法,指针同向而行,即可计算子数组乘积。需要注意停止向右移动left指针,用right-left+1,统计数组乘积小于k数组的数量。