Advantage Shuffle 优势洗牌解析以及java实现

Advantage Shuffle 优势洗牌解析以及java实现

这一题给我们长度相等的两个数组A和B,要求我们返回一个数组,重新排列A,使得A中尽可能多的元素比相同位置上的B的元素要大。

这一题应该是比较明显的要使用贪心算法来解决的,贪心算法只是一个思维,但是具体实现起来是比较难的。让我们明确一下解题思路,其实这一题和田忌赛马很像,如果当前的A中能找到比B[i]大的数字,则我们用比B[I]大的数字中最小的那个与之对应,如果没有则用A中没有用过的最小的数字与之对应。

我们首先将A排序,然后用一个大堆来保存一个int[] 数组,int[0]为当前B中数字的索引,int[1]为B中数字的值。我们由大到小来排列。

我们取出大堆顶端的那个数组,用两个指针分别指向已经排序过的A的头尾,如果A的尾指针对应的值比当前堆顶的值要大,则返回数组中对应位置的值设为A数组尾指针的值,尾指针自减1,反之则赋值为头指针的值,头指针自增1.

让我们来看看代码吧

class Solution {
    public int[] advantageCount(int[] A, int[] B) {
        int[] res = new int[A.length];
        
        Arrays.sort(A);
        PriorityQueue<int[]> maxHeap = new PriorityQueue<>((a,b)->b[1]-a[1]);
        
        for(int i = 0; i < B.length; i++){
            maxHeap.offer(new int[]{i,B[i]});
        }
        int head = 0, tail = A.length-1;
        while(!maxHeap.isEmpty()){
            int[] cur = maxHeap.poll();
            res[cur[0]] = cur[1] >= A[tail]?A[head++]:A[tail--];
        }
        return res;
    }
}

好像也没有什么模板可以总结的,就记住一下实现的方法就好了,一般贪心算法的题目好像都是直接记忆会比较好,自己想可能还真的挺难想出来的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值