这个题解采用了贪心算法的思想。首先,对nums1进行排序,以便尽可能将较小的值与nums2中较小的值匹配。同时,对nums2的索引进行排序,基于nums2的值进行排序,以便我们可以从nums2的最小值开始尝试匹配。接着,我们遍历排序后的nums1,尝试为每个nums2中的值找到一个大于它的最小nums1中的值。如果nums1中的当前值大于nums2中当前考虑的最小值,我们就把这个值分配给它,以此来最大化优势。如果不大于,则把这个值分配给当前nums2中的最大值的位置,尽可能减小'损失'。通过这种方式,我们可以保证nums1的优势最大化。
时间复杂度: O(n log n)
空间复杂度: O(n)
class Solution:
def advantageCount(self, nums1: List[int], nums2: List[int]) -> List[int]:
n = len(nums1)
nums1.sort() # 对nums1进行排序
i2 = sorted(range(n), key=lambda i: nums2[i]) # 根据nums2的值对其索引进行排序
ans = [-1] * n # 初始化结果数组
L, R = 0, n - 1 # 设置双指针,L用于较小的匹配,R用于较大的匹配
for val in nums1: # 遍历排序后的nums1
if val > nums2[i2[L]]: # 如果当前nums1的值可以给nums2的当前最小值优势
ans[i2[L]] = val # 分配并移动L指针
L += 1
else: # 如果不能优势,给当前nums2的最大值
ans[i2[R]] = val # 分配并移动R指针
R -= 1
return ans # 返回最终结果数组