Advantage Shuffle 优势洗牌

给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。

返回 A 的任意排列,使其相对于 B 的优势最大化。

示例 1:

输入:A = [2,7,11,15], B = [1,10,4,11]
输出:[2,11,7,15]

示例 2:

输入:A = [12,24,8,32], B = [13,25,32,11]
输出:[24,32,8,12]

提示:

  1. 1 <= A.length = B.length <= 10000
  2. 0 <= A[i] <= 10^9
  3. 0 <= B[i] <= 10^9

思路:

原则:

       1:我们必须优先满足B中最大的数字,因为他们是比较难满足的。

       2:如果A中最大的数字也不能满足B中的最大数字,那么A的任何数字均不能满足,那么我们让A中最小的元素来对应B的最大元素

伪代码说明:

       先对A按照升序排列,B按照最大堆排列(pair(我们要找到对应关系就必须把B扔到最大堆中,其中first等于值,value等于下标)),并定义两个指针下标lo=0,high=A.size()-1。当最大堆不为空时我们进入循环:每次取出堆顶元素p,如果A的最大值大于B的堆顶元素的value,那么意味着找到了一组对应关系,我们赋值res[idx]=p[high--],否则意味着在A中没有任何一个元素满足B,于是我们把A的最小的元素对应到B(这样做可以筛选出最有可能和B对应的A,和田忌赛马原理有点像),res[idx]=[lo++]。

参考代码:

class Solution {
public:
struct cmp2 {
	bool operator() (const pair &a, const pair &b) {
		return a.first < b.first;
	}
};
vector advantageCount(vector& A, vector& B) {
	priority_queue,vector>,cmp2> great;
	int n = A.size(), lo = 0, high = (A.size() - 1);
	vector res(A.size(), 0);
	sort(A.begin(), A.end());
	for (int i = 0; i < n;i++) great.push(make_pair(B[i], i));
	while (!great.empty()) {
		pair p = great.top();
		great.pop();
		int idx = p.second; int value = p.first;
		if (A[high] > value) res[idx] = A[high--];
		else res[idx] = A[lo++];
	}
	return res;
}
};

 

你可能感兴趣的:(算法)