870. 优势洗牌

题目:

给定两个大小相等的数组 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]

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值