给定两个大小相等的数组 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 <= A.length = B.length <= 10000
0 <= A[i] <= 10^9
0 <= B[i] <= 10^9
思路:
原则:
1:我们必须优先满足B中最大的数字,因为他们是比较难满足的。
2:如果A中最大的数字也不能满足B中的最大数字,那么A的任何数字均不能满足,那么我们让A中最小的元素来对应B的最大元素
伪代码说明:
先对A按照升序排列,B按照最大堆排列(pair<value,idx>(我们要找到对应关系就必须把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++]。
扫描二维码关注公众号,回复:
3125618 查看本文章
参考代码:
class Solution {
public:
struct cmp2 {
bool operator() (const pair<int, int> &a, const pair<int, int> &b) {
return a.first < b.first;
}
};
vector<int> advantageCount(vector<int>& A, vector<int>& B) {
priority_queue<pair<int, int>,vector<pair<int, int>>,cmp2> great;
int n = A.size(), lo = 0, high = (A.size() - 1);
vector<int> 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<int, int> 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;
}
};