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