📜  计算乘积小于 k 的有序数组中的对(1)

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

题目介绍

给定一个有序数组和一个整数k,计算乘积小于k的所有有序数组中的对数。例如,给定数组[2, 3, 4, 5, 6]和k = 30,则有4个三元组(2,3,4),(2,3,5),(2,3,6)和(2,4,5)。

解决思路

这个问题可以通过双指针方法进行解决。根据乘积小于k的定义,对于任何两个元素i和j,如果nums[i] * nums[j] < k,则(i,j)是一个有效的对。可以用一对指针(left,right)表示当前窗口,并通过向左或向右移动其中一个指针来扩展或缩小窗口。

具体方法如下:

  1. 初始化left = 0,right = n - 1,count = 0(计数器)

  2. 当left < right时,执行下面的循环体:

    a. 如果nums[left] * nums[right] < k,则count += right - left,因为此时所有的left到right-1的数都满足条件

    b. 如果nums[left] * nums[right] >= k,则right -= 1

    c. 如果nums[left] * nums[right] < k,则left += 1

  3. 返回count即可。

代码实现

以下是用Python实现上述算法的代码:

def num_pairs(nums, k):
    n = len(nums)
    count = 0
    left, right = 0, n - 1

    while left < right:
        if nums[left] * nums[right] < k:
            count += right - left
            left += 1
        else:
            right -= 1

    return count

测试样例

为了验证我们的算法,我们可以考虑以下几个测试样例:

assert num_pairs([2, 3, 4, 5, 6], 30) == 4
assert num_pairs([1, 1, 1], 1) == 0
assert num_pairs([1, 1, 2], 2) == 2

以上样例都能够通过测试,因此我们可以认为我们的算法是正确的。