📅  最后修改于: 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等情况。