📅  最后修改于: 2023-12-03 15:12:12.381000             🧑  作者: Mango
有两个长为 n 的数组 A 和 B,根据以下规则找出 A 中的一个数和 B 中的一个数,使得这两个数的乘积最大化:
这道题目的关键是如何寻找乘积最大的两个数。我们首先想到直接枚举 A 数组中所有可能的数,然后再在 B 数组中找到相差不超过 k 的数,记录下最大的乘积。但这样的时间复杂度为 O(n^2),算法效率不高。
那么我们能否通过对 A 数组进行排序,然后在 B 数组中根据相差不超过 k 的限制进行查找呢?这样做看似可以减小时间复杂度,但也存在问题。因为排序之后,A 数组的下标和元素的对应关系被打乱了,这显然不符合原题限制条件。所以我们需要另寻他路。
我们可以使用双指针法,即分别维护 A 数组和 B 数组的两个指针,分别指向当前可以选取的数的区域的左右两端。然后通过比较这两个指针指向的两个数的乘积大小,移动乘积较小的那个数对应的指针,一直更新最大的乘积。
时间复杂度:O(n log n)
def max_product(nums1: List[int], nums2: List[int], max_diff: int) -> int:
nums1.sort()
nums2.sort()
i, j = 0, 0
res = float('-inf')
while i < len(nums1) and j < len(nums2):
if abs(nums1[i] - nums2[j]) <= max_diff:
res = max(res, nums1[i] * nums2[j])
i += 1
j += 1
elif nums1[i] < nums2[j]:
i += 1
else:
j += 1
return res
以上代码通过排序之后,分别维护 nums1 和 nums2 两个数组的两个指针,利用双指针法并根据相差不超过 max_diff 的限制查找两个数组中的元素,并找出乘积最大的一对元素。