leetcode 713. 乘积小于K的子数组

给定一个正整数数组 nums。

找出该数组内乘积小于 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的子数组。
说明:

0 < nums.length <= 50000
0 < nums[i] < 1000
0 <= k < 10^6

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-product-less-than-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

采用滑动窗口:

1:设置变量来记录符合的个数sum, 当前窗口中的数字的个数count。

2:遍历数组

若是乘积小于k,则增加count 和sum。并且把窗口的右侧继续扩张。

否则,删除窗口左侧的数字,直到乘积小于K,统计count 和sum。

    public int numSubarrayProductLessThanK(int[] nums, int k) {
        if (k == 0) {
            return 0;
        }
        int sum = 0;
        int count = 0;
        int value = 1;
        int length = nums.length;
        int st = 0;
        for (int i = 0; i < length; i++) {
            int num = nums[i];
            value *= num;
            count++;
            if (value < k) {
                sum += count;
            } else {
                while (value >= k) {
                    value /= nums[st++];
                    count--;
                    if (st > i) {
                        break;
                    }
                }
                if (st <= i) {
                    sum += count;
                }

            }
        }
        return sum;
    }

 

posted @ 2021-06-25 17:34  旺仔古李  阅读(62)  评论(0编辑  收藏  举报