题目描述
思路
本题容易让人想到“田忌赛马”的故事,那么该如何模范“田忌赛马”写出代码呢?
首先,要对nums2进行降序排列,让最大的在前面,同时将原本的下标记录。
其次,要对nums1进行升序排序,同时用left、right表示左右两指针。
最后,遍历排序后的nums2,对于nums2中的最大值,判断nums1中的最大值是否大于它,从而决定该位置是自己上还是用最小的顶上。
class Solution {
public int[] advantageCount(int[] nums1, int[] nums2) {
int len = nums1.length;
// 给num2降序排列,同时记录下标
PriorityQueue<int []> maxpq = new PriorityQueue<>(
(int[] pair1, int[] pair2) -> {
return pair2[1] - pair1[1];
}
);
for (int i = 0; i < len; i++)
maxpq.offer(new int[]{i, nums2[i]});
// 给num1升序排列
Arrays.sort(nums1);
int[] ans = new int[len];
int left = 0, right = len - 1;
while(!maxpq.isEmpty()) {
int[] pair = maxpq.poll();
// maxval是num2中的最大值,i是下标
int i = pair[0], maxval = pair[1];
if (maxval < nums1[right]) {
// 如果nums1[right]大于maxval,自己上
ans[i] = nums1[right--];
} else {
// 用最小的顶上
ans[i] = nums1[left++];
}
}
return ans;
}
}