029、田忌赛马(labuladong)

文章介绍了如何运用田忌赛马的策略解决LeetCode的870题——优势洗牌。通过优先级队列和排序,确保数组nums1的元素尽可能大于nums2的对应元素。代码示例展示了如何构建和使用优先级队列来优化数组元素的位置。
摘要由CSDN通过智能技术生成

田忌赛马

基于labuladong的算法网站,田忌赛马背后的算法决策

1、概述

田忌赛马的核心是在于尽可能地让自己占便宜,让对方吃亏。
力扣第870题,优势洗牌,两个长度相等的数组,重新组织num1的元素位置,让num1的元素尽可能地大于nums2相同位置处的元素。

2、代码实现

因为结果依赖于nums2的元素位置,所以不能随便将数组nums2进行排序,需要依赖特殊的结构,优先级队列,进行数组元素下标和数组元素的一一对应:

[870]优势洗牌

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] advantageCount(int[] nums1, int[] nums2) {
        // 先将数组nums1进行从小到大的排序
        Arrays.sort(nums1);
        // 需要用优先级队列
        // (优先级队列中存储的是一个数组,数组有两个元素,第一个元素代表下标,第二个元素为nums2中该下标的元素值)
        // 按照从大到小的顺序进行排列
        PriorityQueue<int[]> queue = new PriorityQueue<>((int[] a, int[] b) -> {
            return b[1] - a[1];
        });
        for (int i = 0; i < nums2.length; i++) {
            queue.add(new int[]{i, nums2[i]});
        }
        // 开始进行田忌赛马
        int left = 0, right = nums1.length - 1;
        int[] res = new int[nums1.length];// 返回的结果
        int index = 0;
        while (!queue.isEmpty()) {
            int[] temp = queue.poll();// 将优先级队列中的最大元素弹出
            if (temp[1] >= nums1[right]) {
                res[temp[0]] = nums1[left++];
            } else {
                res[temp[0]] = nums1[right--];
            }
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值