力扣labuladong一刷day25天
力扣labuladong一刷day24天
一、870. 优势洗牌
题目链接:https://leetcode.cn/problems/advantage-shuffle/
思路:这个就和田忌赛马是一样的,要求nums1[i]>nums2[i]才叫有优势,那么只需要把nums1和nums2都排序,逐个比较,如果nums1[i]>nums2[i]那么就采用nums[i],如果nums1[i]<=nums2[i]那就应该用最小的nums1去应对。但是题目要求的是排序nums1让其对nums2有优势,所以nums2不能排序,那我们比较又需要排序,这个时候可以使用优先级队列,排序nums2并且记录下nums2的索引,然后也把nums1给排序,这样就可以通过最大值的比较,填入对应的索引位置。
class Solution {
public int[] advantageCount(int[] nums1, int[] nums2) {
int n = nums1.length;
PriorityQueue<int[]> queue = new PriorityQueue<>(
(int[] ints1, int[] ints2) -> ints2[1]-ints1[1]
);
for (int i = 0; i < n; i++) {
queue.add(new int[]{i, nums2[i]});
}
int[] res = new int[n];
Arrays.sort(nums1);
int left = 0, right = n-1;
while (!queue.isEmpty()) {
int[] ints = queue.poll();
int i = ints[0], value = ints[1];
if (nums1[right] > value) {
res[i] = nums1[right--];
}else {
res[i] = nums1[left++];
}
}
return res;
}
}