📅  最后修改于: 2023-12-03 15:26:25.322000             🧑  作者: Mango
给定两个已排序的整数数组 nums1 和 nums2,以及一个整数 k。定义一对 (i,j)其中 0 ≤ i < nums1.length 且 0 ≤ j < nums2.length,使得满足:nums1[i] + nums2[j] ≤ k 。 请找出满足条件的最大对数并返回该数字。
由于两个数组已排序,我们可以考虑使用双指针的方法进行遍历。 我们用指针 i 指向数组 nums1,指针 j 指向数组 nums2,并将它们同时向右移动。 如果 nums1[i] + nums2[j] > k,则将指针 j 向左移动一位,如果 nums1[i] + nums2[j] <= k,则将指针 i 向右移动一位,并将结果计入答案中。 遍历完成后,我们就可以得到最大的对数。
我们可以使用二分查找的方法来查找符合要求的数。 我们用指针 i 指向数组 nums1,指针 j 指向数组 nums2。 然后我们对数组 nums2 中的每个元素,在数组 nums1 中进行二分查找,找到最小的那个满足 nums1[i] + nums2[j] <= k 的下标,记作 t。 那么对于相同的 j,下标小于等于 t 的数都可以和 j 组成一对满足条件的数。 在遍历过程中,我们计算总共存在的对数并返回。
def max_pairs(nums1, nums2, k):
i, j = 0, len(nums2) - 1
ans = 0
for i in range(len(nums1)):
while j >= 0 and nums1[i] + nums2[j] > k:
j -= 1
if j < 0:
break
ans += j + 1
return ans
def max_pairs(nums1, nums2, k):
ans = 0
for j in range(len(nums2)):
i = bisect_right(nums1, k - nums2[j])
ans += i
return ans
本题让我们求解两个数组中所有满足条件的数对个数,具体实现方法有双指针和二分查找两种。 对于双指针,我们通过移动指针 i 和 j,判断是否满足条件,计算出结果。 对于二分查找,我们对数组 nums2 中的每个元素,在数组 nums1 中进行二分查找,找到最小的那个满足 nums1[i] + nums2[j] <= k 的下标,计算出结果。 无论哪种方法都可以达到 O(nlogn) 的时间复杂度,但双指针的实现相对简单一些,而二分查找需要使用 Python 的标准库中的 bisect 模块。