刷题进行时-双指针-713. 乘积小于 K 的子数组

给你一个整数数组 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)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容