📅  最后修改于: 2023-12-03 14:55:18.912000             🧑  作者: Mango
给定两个长度分别为 m
和 n
的整数数组 nums1
和 nums2
,请你找出满足下述条件的不同对 (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)$ 的时间复杂度。
具体步骤如下:
i
、j
分别指向两个数组的末尾,设当前计数器变量为 count
。nums1[i] <= nums2[j]
,则有 $i + 1$ 个数字可以与 nums2[j]
构成满足条件的对,加上计数器 count
。nums1[i] > nums2[j]
,则将指针 i
前移一位。最终计数器变量 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)$。