力扣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;
    }
}

你可能感兴趣的:(力扣算法题,leetcode,算法,职场和发展)