题目:
给定两个大小相等的数组 A
和 B
,A 相对于 B 的优势可以用满足 A[i] > B[i]
的索引 i
的数目来描述。
返回 A
的任意排列,使其相对于 B
的优势最大化。
思路:
对A进行排序,而后对B进行遍历,大于B的进行记录。该思路发现问题,
输入:[2,0,4,1,2] [1,3,0,0,2]
输出:[1,4,0,2,2]
预期:[2,0,2,1,4]
该输入时不能达到最优解。所以需要对B进行排序并对其原有的位置进行记录
正序比较和倒序比较可以达到相同的效果,但是从代码的角度上讲,倒叙更加便捷一些
1.正序比较
对A、B进行排序,字典记录B的位置,并对整体小于B的a中的元素进行记录
def advantageCount(self, A: List[int], B: List[int]) -> List[int]:
A.sort()
B2 = sorted(B)
bb = {b:[] for b in B}
r = []
j = 0
for a in A:
if a > B2[j]:
bb[B2[j]].append(a)
j += 1
else:
r.append(a)
return [bb[b].pop() if bb[b] else r.pop() for b in B]
2.倒叙比较,A、B进行排序,如果B最大的比A最大的大,就把A最小的和其配对,同样使用字典对位置进行记录
def advantageCount(self, A: List[int], B: List[int]) -> List[int]:
A.sort()
B2 = sorted(B)
bb = {b:[] for b in B}
j = len(B2) - 1
s = 0 #用于记录A的头
e = j #A的尾
while j >= 0 :
if A[e] > B2[j]: #采用赛马策略,如果B最大的比A最大的大,就把A最小的和其配对
bb[B2[j]].append(A[e])
e -= 1
else:
bb[B2[j]].append(A[s])
s += 1
j -= 1
return [bb[b].pop() for b in B]