给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。
    返回 A 的任意排列,使其相对于 B 的优势最大化。image.png

    1. public static int[] advantageCount(int[] A, int[] B) {
    2. int[] sortedA = A.clone();
    3. Arrays.sort(sortedA);
    4. //找一个代价最小的去匹配B中的,比B大,在A中又是最小的
    5. int[] sortedB = B.clone();
    6. Arrays.sort(sortedB);
    7. //避免比较时,A每次都要重头遍历
    8. Map<Integer, Deque<Integer>> assigned = new HashMap();
    9. for (int b : B)
    10. assigned.put(b, new LinkedList());
    11. Deque<Integer> remaining = new LinkedList();
    12. int j = 0;
    13. for (int a : sortedA) {
    14. if (a > sortedB[j]) {
    15. assigned.get(sortedB[j++]).add(a);
    16. } else {
    17. remaining.add(a);
    18. }
    19. }
    20. int[] ans = new int[B.length];
    21. for (int i = 0; i < B.length; ++i) {
    22. if (assigned.get(B[i]).size() > 0) {
    23. ans[i] = assigned.get(B[i]).removeLast();
    24. } else {
    25. ans[i] = remaining.removeLast();
    26. }
    27. }
    28. return ans;
    29. }

    时间复杂度:O(N log N),其中 N 是 A 和 B 的长度。
    空间复杂度:O(N)。