给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
示例 1:
输入:nums = [10,5,2,6], k = 100
输出:8
解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。
需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。
package 滑动窗口;
import java.util.*;
//leetcode submit region begin(Prohibit modification and deletion)
class SubarrayProductLessThanK713 {
Set<int[]> set1 = new TreeSet<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1.length != o2.length) {
return 1;
} else {
for (int i = 0; i < o1.length; i++) {
if (o1[i] > o2[i]) {
return 1;
} else if(o1[i] < o2[i]) {
return -1;
}
}
return 0;
}
}
});
public int numSubarrayProductLessThanK(int[] nums, int k) {
//同样排除k为1的情况比如 [1,1,1] k=1
if (k <= 1) {
return 0;
}
int left = 0;
int right = 0;
//创建一个变量记录路上的乘积
int mul = 1;
//记录连续数组的组合个数
int ans = 0;
//用右指针遍历整个数组,每次循环右指针右移一次
while(right<nums.length) {
//记录乘积
mul *= nums[right];
//当大于等于k,左指针右移并把之前左指针的数除掉
while (mul >= k) {
mul /= nums[left];
left++;
}
//每次右指针位移到一个新位置,应该加上 x 种数组组合:
// nums[right]
// nums[right-1], nums[right]
// nums[right-2], nums[right-1], nums[right]
// nums[left], ......, nums[right-2], nums[right-1], nums[right]
//共有 right - left + 1 种
ans += right - left + 1;
//右指针右移
right++;
}
return ans;
}
// public int numSubarrayProductLessThanK(int[] nums, int k) {
// int i = 0;
// int j = 0;
// int curSum = nums[0];
// while (true) {
// if (curSum < k) {
// if (j>i || j == nums.length-1) {
// for (int l = i; l < j+1; l++) {
// for (int m = l; m < j+1; m++) {
// set1.add(new int[]{l,m});
// }
// }
// if (j == nums.length-1) {
// break;
// }
// } else {
// set1.add(new int[]{i,j});
// }
// j++;
// curSum *= nums[j];
// } else {
// curSum /= nums[i];
// i++;
// if (i == nums.length) {
// break;
// }
// if (i > j) {
// j = i;
// }
// }
// }
// return set1.size();
// }
public static void main(String[] args) {
SubarrayProductLessThanK713 so = new SubarrayProductLessThanK713();
int a = so.numSubarrayProductLessThanK(new int[]{10,5,2,6}, 100);
int b = 1;
}
}
//leetcode submit region end(Prohibit modification and deletion)