leetcode 870 优势洗牌 贪心算法
题目:给定两个大小相等的数组 A 和 B
A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。
返回 A 的任意排列,使其相对于 B 的优势最大化。
分析:
想要获得最优匹配
先和B中小的元素匹配,获取更多优势
b代表B中最小元素
在 A 数组中找到大于b的最小元素
在找的过程中,如果A中存在c,c<b,将c放入quit队列中
比较完成后,将quit中的元素和B中剩余的元素匹配
过程动图:
代码:
class Solution {
public:
struct Node{
int x=0;
int y=0;
};
static bool compare ( Node a, Node b){
return a.x<=b.x;
}
vector<int> advantageCount(vector<int>& A, vector<int>& B) {
int m= A.size();
vector<Node>helper(m);
vector<int> res(m);
for(int i=0;i<m;i++){
Node t;
t.x=B[i];
t.y=i;
helper[i]=t;
}
sort(A.begin(),A.end());
sort(helper.begin(),helper.end(),compare);
queue<int> quit_A;
int i,j;
for(i=0,j=0;i<m;i++){
if(A[i]>helper[j].x){
res[helper[j].y]=A[i];
j++;
}
else
quit_A.push(A[i]);
}
if(!quit_A.empty()){
for(;j<m;j++){
int temp=quit_A.front();
quit_A.pop();
res[helper[j].y]=temp;
}
}
return res;
}
};
时间复杂度: O(nlogn)
欢迎大家多多指正!