classSolution{publicint[]advantageCount(int[] nums1,int[] nums2){int n = nums1.length;//设置优先队列,排序的规则是从大到小排列PriorityQueue<int[]> maxpq =newPriorityQueue<>((int[] pair1,int[] pair2)->{return pair2[1]- pair1[1];});//将nums1排序(从小到大)Arrays.sort(nums1);int left =0, right = n-1;int[] res =newint[n];for(int i =0; i < n; i++)
maxpq.offer(newint[]{i, nums2[i]});while(!maxpq.isEmpty()){int[] pair = maxpq.poll();//maxpq 第一个是max,而对于nums1来说,最右边是maxint i = pair[0], maxval = pair[1];if(maxval < nums1[right]){
res[i]= nums1[right];
right--;}else{
res[i]= nums1[left];
left++;}}return res;}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
法二:索引排序法
classSolution{publicint[]advantageCount(int[] nums1,int[] nums2){int n = nums1.length;Integer[] index =newInteger[n];for(int i =0; i < n; i++)
index[i]= i;Arrays.sort(nums1);//从小到大排序Arrays.sort(index,(i, j)-> nums2[i]- nums2[j]);int left =0, right = n-1;//直接再nums2上更新结果,如果num大放到前面,如果num小,放到最后面去for(int num : nums1){if(num > nums2[index[left]])
nums2[index[left++]]= num;else
nums2[index[right--]]= num;}return nums2;}}