870. Advantage Shuffle

问题:

给定两个size相同的数组A,B

对A进行排列,使得同位 i 上对数,A[i]>B[i],求使得满足这样条件元素最多的A的排列。

Example 1:
Input: A = [2,7,11,15], B = [1,10,4,11]
Output: [2,11,7,15]

Example 2:
Input: A = [12,24,8,32], B = [13,25,32,11]
Output: [24,32,8,12]
 

Note:
1 <= A.length = B.length <= 10000
0 <= A[i] <= 10^9
0 <= B[i] <= 10^9

  

解法:贪婪算法

思想:对A进行从小到大排序,

遍历B,对B的每一个元素b,在A中从小到大找A[i]>b最小的A[i],

若不存在这样的A[i],则用当前A中最小的A[0]去对应b。

代码参考:

 1 class Solution {
 2 public:
 3     vector<int> advantageCount(vector<int>& A, vector<int>& B) {
 4         vector<int> res;
 5         int i=0;
 6         sort(A.begin(), A.end());
 7         for(int b:B){
 8             int size=A.size();
 9             for(i=0; i<A.size(); i++){
10                 if(A[i]>b){
11                     res.push_back(A[i]);
12                     A.erase(A.begin()+i);
13                     break;
14                 }
15             }
16             if(A.size()>0 && i==size){
17                 res.push_back(A[0]);
18                 A.erase(A.begin());
19             }
20         }
21         return res;
22     }
23 };

♻️优化,使用C++的multiset,(保存排序A)

使用upper_bound(b)二分查找来找到第一个大于b的数值。

代码参考:

 1 static auto x = []() {
 2     ios_base::sync_with_stdio(false);
 3     cin.tie(NULL);
 4     return NULL;
 5 }();
 6 
 7 class Solution {
 8 public:
 9     vector<int> advantageCount(vector<int>& A, vector<int>& B) {
10         multiset<int> s(A.begin(), A.end());
11         vector<int> res;
12         for(int b:B){
13             auto p=s.upper_bound(b);
14             if(p==s.end()) p=s.begin();
15             res.push_back(*p);
16             s.erase(p);
17         }
18         return res;
19     }
20 };

 

上一篇:算法3: 寻找两个正序数组的中位数


下一篇:正则表达式匹配字符串中的数字 Python