給懶人寫的優勢洗牌

給定兩個大小相等的數組 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章