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剩下的元素中随便取一个即可。