---
# System prepended metadata

title: 0870. Advantage Shuffle
tags: [Leetcode, Medium, Greedy]

---

# 0870. Advantage Shuffle
###### tags: `Leetcode` `Medium` `Greedy`
Link: https://leetcode.com/problems/advantage-shuffle/
## 思路
### 思路一 TreeMap $O(NlogN)$ $O(N)$
先把nums1都存在TreeMap里面，然后用```higherKey()```找到比它大的最小的key 如果没有就把最小值给它
### 思路二 $O(NlogN)$ $O(N)$
第一反应是给两个array排序 (nums2需要是倒序) 然后遍历nums2 在nums1上面用双指针 先看右指针指的数字是不是比nums2现在的数字大 如果不是的话就只能用左指针指的比较小的数(也就是第9-11行做的事情)
但是这样会导致原来的顺序错了 方法就是我们**不排序数字本身 我们排序index** 这样就可以保留顺序了
不过需要注意的是排序index不能写成```Arrays.sort(index, (a,b)->(nums2[b]-nums2[a]))```而是要写成```Arrays.sort(index, (a,b)->Integer.compare(nums2[b], nums2[a])``` 同时index的数据类型还要设成Integer
## Code
### 思路一
```java=
class Solution {
    public int[] advantageCount(int[] nums1, int[] nums2) {
        TreeMap<Integer, Integer> cnt = new TreeMap<>();
        for(int num:nums1) cnt.put(num, cnt.getOrDefault(num, 0)+1);
        int[] ans = new int[nums1.length];
        
        for(int i=0; i<nums2.length; i++){
            int num = nums2[i];
            Integer next = cnt.higherKey(num);
            if(next==null) next = cnt.firstKey();
            cnt.put(next, cnt.get(next)-1);
            if(cnt.get(next)==0) cnt.remove(next);
            ans[i] = next;
        }
        return ans;
    }
}
```
### 思路二
```java=
class Solution {
    public int[] advantageCount(int[] nums1, int[] nums2) {
        int[] ans = new int[nums1.length];
        Integer[] index = new Integer[nums1.length];
        for(int i=0; i<nums1.length; i++) index[i]=i;
        Arrays.sort(index, (a,b)->Integer.compare(nums2[b],nums2[a]));
        Arrays.sort(nums1);
        
        int l=0, r=nums1.length-1;
        for(int idx:index){
            ans[idx] = nums2[idx]<nums1[r]?nums1[r--]:nums1[l++];
        }
        return ans;
    }
}
```