LeetCode Problems 870

2018/11/25

870. Advantage Shuffle

问题描述

Given two arrays A and B of equal size, the advantage of A with respect to B is the number of indices i for which A[i] > B[i].

Return any permutation of A that maximizes its advantage with respect to B.

测试样例

Example 1:

Input: A = [2,7,11,15], B = [1,10,4,11]
Output: [2,11,7,15]

Example 2:

Input: A = [12,24,8,32], B = [13,25,32,11]
Output: [24,32,8,12]

Note:

  • 1 <= A.length = B.length <= 10000
  • 0 <= A[i] <= 10^9
  • 0 <= B[i] <= 10^9

问题分析

本题难度为Medium!属于贪心问题,已给出的函数定义为

class Solution:
    def advantageCount(self, A, B):
        """
        :type A: List[int]
        :type B: List[int]
        :rtype: List[int]
        """

本题可采用贪心思想进行解题,解题思路参考田忌赛马设计思想。将A和B中的数字视为马的强弱值,如果要实现比较中A[i]>B[i]的索引数目最多,则需要先用最强的马进行比较,规则是A中的强马只和B中比它稍弱的强马比较,如果B中的马都比A中的马强,则用A中最弱的马与B中最强的马比较。

想要使A[i] > B[i]的索引数目最多,应该先考虑大的元素,再考虑小的元素,因为越大的元素越难满足条件。而对于A中的元素,大的元素应该先去和B中的大元素比较,从大到小,找到它“有优势”的元素。因此,肯定是要对两个数组都进行排序的。

代码实现

#coding=utf-8
class Solution:
    def advantageCount(self, A, B):
        A = sorted(A)
        take = collections.defaultdict(list)
        for b in sorted(B)[::-1]:
            if b < A[-1]: take[b].append(A.pop())
        return [(take[b] or A).pop() for b in B]

先把A和B排序,再利用collection,以B中元素b为key,把A中大于B[i]且小于B[i-1]的元素存入key为b对应的list(考虑到B中元素有重复的情况,如果没有重复,那么一个b对应的list也只有一个元素)。如果collection中b对应的list有元素,那么结果中b对应的位置就应该放置该元素,否则,说明该位置没有满足要求的元素,在A剩下的元素中随便取一个即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值