870. 优势洗牌

152 阅读1分钟

题目描述

870. 优势洗牌 - 力扣(LeetCode)

思路

本题容易让人想到“田忌赛马”的故事,那么该如何模范“田忌赛马”写出代码呢?

首先,要对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;
    }
}