给懒人写的优势洗牌

给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。
返回 A 的任意排列,使其相对于 B 的优势最大化。

难点分析:

  1. 如何贪心匹配
  2. 如何保存匹配结果

贪心匹配:

  • 田忌赛马:总是在A中找到最小能大于B的元素与其匹配
  • 这会剩下B[i]>max(A)的元素,将其和A未匹配元素任意匹配即可

保存匹配元素:
注意题目要按B原排列输出,而对B排序后,匹配结果顺序已变,所以一组数据记录原排序,一组数据记录匹配结果。;两组数据生成原排序匹配

  • 记录原排序: ord_B=B.copy()(直接ord_B=B,是错误的,这是引用)
  • 记录匹配结果:d={b:[]},采用映射关系,键是B的元素。值是匹配结果,之所以是[],是因为B中可能有相同元素,匹配结果不唯一
    原排序匹配:依次将ord_B的元素作为键,读取字典值的首元素,存入列表中。并删除首元素
class Solution:
    def advantageCount(self, A: List[int], B: List[int]) -> List[int]:
        ord_B=B.copy()
        A.sort()
        B.sort()
        k=0
        d={b:deque() for b in B}
        aa=[]
        for a in A:
            if a>B[k]:
                d[B[k]].append(a)
                k+=1
            else:
                aa.append(a)
        for aaa in aa:
            d[B[k]].append(aaa)
            k+=1
        now_A=[]
        for b in ord_B:
            now_A.append(d[b][0])
            d[b].popleft()
        return now_A

你可能感兴趣的:(贪心算法)