# 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; } } ```