[LeetCode] 713. 乘积小于K的子数组

1 题目描述

给定一个正整数数组 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2 解题思路

方法:双指针

对于每个right,我们需要找到最小的 i=left, 在这里插入图片描述
由于当 left 增加时,这个乘积是单调不增的,因此我们可以使用双指针的方法,单调地移动 left。

算法

我们使用一重循环枚举 right,同时设置 left 的初始值为 0。在循环的每一步中,表示 right 向右移动了一位,将乘积乘以 nums[right]。此时我们需要向右移动 left,直到满足乘积小于 k 的条件。在每次移动时,需要将乘积除以 nums[left]。当 left 移动完成后,对于当前的 right,就包含了 right−left+1 个乘积小于 k 的连续子数组。
复杂度分析
时间复杂度:O(n),其中 n 是 nums 数组的长度。循环的时间复杂度为 O(n),而 left 最多移动 n 次,因此总的时间复杂度为 O(n)。
空间复杂度:O(1)。

作者:LeetCode
链接:https://leetcode-cn.com/problems/subarray-product-less-than-k/solution/cheng-ji-xiao-yu-kde-zi-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3 解决代码

class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        if (k <= 1) return 0;
        int prod = 1, ans = 0, left = 0;
        for (int right = 0; right < nums.length; right++) {
            prod *= nums[right];
            while (prod >= k) prod /= nums[left++];
            ans += right - left + 1;
        }
        return ans;
    }
}

你可能感兴趣的:(力扣LeetCode)