leetcode 870题 优势洗牌
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中剩余的元素匹配
过程动图:
代码:
1 class Solution { 2 public: 3 struct Node{ 4 int x=0; 5 int y=0; 6 }; 7 static bool compare ( Node a, Node b){ 8 return a.x<=b.x; 9 } 10 vector<int> advantageCount(vector<int>& A, vector<int>& B) { 11 int m= A.size(); 12 vector<Node>helper(m); 13 vector<int> res(m); 14 for(int i=0;i<m;i++){ 15 Node t; 16 t.x=B[i]; 17 t.y=i; 18 helper[i]=t; 19 } 20 sort(A.begin(),A.end()); 21 sort(helper.begin(),helper.end(),compare); 22 queue<int> quit_A; 23 int i,j; 24 for(i=0,j=0;i<m;i++){ 25 if(A[i]>helper[j].x){ 26 res[helper[j].y]=A[i]; 27 j++; 28 } 29 else 30 quit_A.push(A[i]); 31 } 32 if(!quit_A.empty()){ 33 for(;j<m;j++){ 34 int temp=quit_A.front(); 35 quit_A.pop(); 36 res[helper[j].y]=temp; 37 } 38 } 39 return res; 40 } 41 };
这是我在csdn写的:https://blog.csdn.net/weixin_44384461/article/details/105060353