📌  相关文章
📜  最大化来自两个数组的对 (i, j) 的数量,其中第一个数组的元素不超过第二个数组的元素(1)

📅  最后修改于: 2023-12-03 14:55:18.912000             🧑  作者: Mango

最大化来自两个数组的对 (i, j) 的数量,其中第一个数组的元素不超过第二个数组的元素

问题描述

给定两个长度分别为 mn 的整数数组 nums1nums2,请你找出满足下述条件的不同对 (i, j) 的数量,其中第一个元素来自 nums1,第二个元素来自 nums2

$$nums1_i \leq nums2_j$$

实现函数 maximizePair 来计算并返回满足条件的对数。请注意,对数可能非常大,请将结果对 10^9 + 7 取模。

示例
输入:nums1 = [2,1,100], nums2 = [3,5,6]
输出:4
解释:有 4 对数字 (i, j) 满足 nums1[i] <= nums2[j]:
(2,3), (2,5), (1,3), (1,5)。
解法

直观上感觉是利用双指针、二分搜索等方法计算,但是可以通过一种比较巧妙的方式达到 $O(m + n)$ 的时间复杂度。

具体步骤如下:

  1. 对两个数组分别排序。
  2. 从后往前遍历两个数组,分别用指针 ij 分别指向两个数组的末尾,设当前计数器变量为 count
  3. 如果当前 nums1[i] <= nums2[j],则有 $i + 1$ 个数字可以与 nums2[j] 构成满足条件的对,加上计数器 count
  4. 如果当前 nums1[i] > nums2[j],则将指针 i 前移一位。
  5. 不断重复步骤 3 和 4 直到遍历完成。

最终计数器变量 count 即是所求的结果。

代码实现
def maximizePair(nums1: List[int], nums2: List[int]) -> int:
    nums1.sort()
    nums2.sort()
    i, j = len(nums1) - 1, len(nums2) - 1
    count = 0
    mod = 10 ** 9 + 7
    while i >= 0 and j >= 0:
        if nums1[i] <= nums2[j]:
            count += j + 1
            i -= 1
        else:
            j -= 1
    return count % mod

时间复杂度为 $O(m + n)$。