描述
给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
分析
用一个变量表示子数组的乘积,右指针遍历数组,每次走一个位置。
计算以当前右指针指向的元素为结尾的且乘积小于K的子数组个数,右指针在每个位置上都这样计算,这样就能够考虑全部的子数组情况。
当数组乘积大于等于K时,移动左指针。
关于right - left + 1的理解
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
int ans = 0;
int left = 0, right = 0;
int mult = 1;
while (right < nums.length) {
mult *= nums[right];
while (mult >= k && left <= right) {
mult /= nums[left];
left++;
}
//若单个元素的值就超过了K,则上述计算left等于right + 1,ans不会增加。
ans += right - left + 1;
right++;
}
return ans;
}
}