给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 Ai] > Bi] 的索的数目来描述。
返回 A的任意排列,使其相对于 B 的优势最大化.
其实核心思想就是让A中的数最小且刚好大于B中数,我们可以用链表来存储A和B中对应的数据,至于B比A中所有的数都大的数据,则匹配我们A中剩余的数字即可(随意匹配即可).
下面是具体实现的代码:
package test;
import java.util.*;
public class Algorithm {
public static void main(String[] args) {
int[] advantage = advantage(new int[]{9, 17, 19, 11, 13, 14}, new int[]{21, 10, 16, 20, 16, 12});
System.out.println("田忌赛马结果是:" +Arrays.toString(advantage));
}
//田忌赛马
public static int[] advantage(int[] A, int[] B) {
int[] bclone = B.clone();
Arrays.sort(bclone);
Arrays.sort(A);
Map<Integer, Deque<Integer>> bMap = new HashMap<>();
for (int b : B) {
bMap.put(b, new LinkedList<>());
}
Deque<Integer> aDeque = new LinkedList<>();
int j = 0;
for (int a : A) {
if (a > bclone[j]) {
bMap.get(bclone[j]).add(a);
j++;
} else {
aDeque.add(a);
}
}
int[] ans = new int[A.length];
for (int i = 0; i < B.length; i++) {
if (bMap.get(B[i]).size() > 0) {
ans[i] = bMap.get(B[i]).removeLast();
} else {
ans[i] = aDeque.removeLast();
}
}
return ans;
}
}
输出结果:田忌赛马结果是:[14, 11, 19, 9, 17, 13]
【力扣算法题】优势洗牌(田忌赛马)-贪心_哔哩哔哩_bilibili