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

posted @ 2020-03-29 19:13  scyrc  阅读(219)  评论(0编辑  收藏  举报