📌  相关文章
📜  计算所有乘积小于K的子序列(1)

📅  最后修改于: 2023-12-03 15:28:01.842000             🧑  作者: Mango

题目介绍

本题给出一个长度为n的正整数序列和一个整数k,要求计算所有乘积小于k的子序列数量。

解题思路

首先要明确的是,本题给出的是正整数序列,因此我们不用考虑负数的情况。其次,我们可以观察到,当序列中没有0或者k时,所有子序列的乘积一定是正的,所以只需要考虑乘积小于k的情况。

因此,我们可以使用双指针法来解决本题。设左指针left和右指针right,从序列的第一个元素开始遍历。每次right向右移动一位,并计算当前子序列的乘积prod,如果prod小于k,则当前包含right的子序列都满足条件,因此子序列的数量增加right-left+1个;如果prod大于等于k,则left向右移动一位,并将prod除以左指针所指的元素,直到prod小于k为止。

具体实现可以使用Python语言,代码如下:

def countSubsequences(nums, k):
    n = len(nums)
    left, right, prod, ans = 0, 0, 1, 0
    while right < n:
        prod *= nums[right]
        while left <= right and prod >= k:
            prod /= nums[left]
            left += 1
        ans += right - left + 1
        right += 1
    return ans

测试样例

为了验证代码的正确性和鲁棒性,我们可以使用一些测试样例进行测试。下面给出几个样例:

样例1:

输入:

nums = [10, 5, 2, 6], k = 100

输出:

8

解释:

所有乘积小于100的子序列分别为:

[10], [5], [2], [6], [10, 5], [5, 2], [2, 6], [5, 2, 6]

共8个。

样例2:

输入:

nums = [1, 2, 3], k = 0

输出:

0

解释:

由于k=0,不存在乘积小于k的子序列。

总结

以上就是本题的解题思路和Python代码,双指针法的时间复杂度为O(n),可以通过本题。并且,我们在实现代码时还需要注意一些边界情况,例如k为0、序列中包含0等情况。