列表

详情


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 的子数组。

示例 2:

输入:nums = [1,2,3], k = 0
输出:0

 

提示: 

相似题目

乘积最大子数组

和等于 k 的最长子数组长度

和为 K 的子数组

小于 K 的两数之和

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int numSubarrayProductLessThanK(vector<int>& nums, int k) { } };

golang 解法, 执行用时: 84 ms, 内存消耗: 7 MB, 提交时间: 2022-11-23 11:15:57

func numSubarrayProductLessThanK(nums []int, k int) (ans int) {
    if k == 0 {
        return
    }
    n := len(nums)
    logPrefix := make([]float64, n+1)
    for i, num := range nums {
        logPrefix[i+1] = logPrefix[i] + math.Log(float64(num))
    }
    logK := math.Log(float64(k))
    for j := 1; j <= n; j++ {
        l := sort.SearchFloat64s(logPrefix[:j], logPrefix[j]-logK+1e-10)
        ans += j - l
    }
    return
}

golang 解法, 执行用时: 68 ms, 内存消耗: 7.2 MB, 提交时间: 2022-11-23 11:14:40

func numSubarrayProductLessThanK(nums []int, k int) (ans int) {
    prod, i := 1, 0
    for j, num := range nums {
        prod *= num
        for ; i <= j && prod >= k; i++ {
            prod /= nums[i]
        }
        ans += j - i + 1
    }
    return
}

python3 解法, 执行用时: 144 ms, 内存消耗: 17.1 MB, 提交时间: 2022-11-23 11:14:15

class Solution:
    def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
        '''滑动窗口'''
        ans, prod, i = 0, 1, 0
        for j, num in enumerate(nums):
            prod *= num
            while i <= j and prod >= k:
                prod //= nums[i]
                i += 1
            ans += j - i + 1
        return ans

python3 解法, 执行用时: 248 ms, 内存消耗: 17.4 MB, 提交时间: 2022-11-23 11:13:29

class Solution:
    def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
        if k == 0:
            return 0
        ans, n = 0, len(nums)
        logPrefix = [0] * (n + 1)
        for i, num in enumerate(nums):
            logPrefix[i + 1] = logPrefix[i] + log(num)
        logK = log(k)
        for j in range(1, n + 1):
            l = bisect_right(logPrefix, logPrefix[j] - logK + 1e-10, 0, j)
            ans += j - l
        return ans

上一题