-
Notifications
You must be signed in to change notification settings - Fork 1
/
Advantage_Shuffle.cpp
37 lines (36 loc) · 1.26 KB
/
Advantage_Shuffle.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//Leetcode 870
//贪心方法:对A排序,然后对于每个B[i],从左到右查找第一个大于B[i]的元素,如果没使用则使用,否则继续向右查找。如果找不到,则在A中找一个仍没使用的最小的元素。
class Solution {
public:
vector<int> advantageCount(vector<int>& A, vector<int>& B) {
int n = A.size();
vector<int> res(n, 0);
sort(A.begin(), A.end());
vector<bool> is_used(n, false);
int min_ind = 0;
for(int i=0;i<n;++i) {
int c = B[i];
auto ind = upper_bound(A.begin(), A.end(), c); //第一个>c的值
if(ind == A.end()) {
while(is_used[min_ind]) min_ind++;
is_used[min_ind] = true;
res[i] = A[min_ind++];
continue;
}
int A_ind = (ind - A.begin());
while(A_ind<n) {
if(!is_used[A_ind]) break;
++A_ind;
}
if(A_ind >= n) {
while(is_used[min_ind]) min_ind++;
is_used[min_ind] = true;
res[i] = A[min_ind++];
continue;
}
is_used[A_ind] = true;
res[i] = A[A_ind];
}
return res;
}
};