给定两个大小相等的数组 A
和 B
,A 相对于 B 的优势可以用满足 A[i] > B[i]
的索引 i
的数目来描述。
返回 A
的任意排列,使其相对于 B
的优势最大化。
示例 1:
输入:A = [2,7,11,15], B = [1,10,4,11] 输出:[2,11,7,15]
示例 2:
输入:A = [12,24,8,32], B = [13,25,32,11] 输出:[24,32,8,12]
思路:把A的全排列的各种情况都考虑一下,找到最多的优势,然后将该排列输出,代码如下
vector<int> c; vector<int> advantageCount(vector<int>& A, vector<int>& B) { sort(A.begin(),A.end()); int count,max=0; do { count=0; for(int i=0;i<B.size();i++) { if(A[i]>B[i]) count++; } //max=max>count?max:count; if(count>max) { c=A; max=count; } } while(next_permutation(A.begin(),A.end())); return c; }
不过,next_permutation函数的时间复杂度很高,是n!,所以当数组元素个数小于11个,还可以,但是超过11个,时间复杂度太高,不可取。
另外有贪心的思想,先将A和B都从大到小的排好序,对于A中的每个元素,都试图找到一个刚好大于B的元素的那个位置,如果实在找不到,证明B中的元素都比A中元素要大了,(A中剩下的最大元素,都找不到比其小的,剩下的就更找不到了)这个时候就随机放就可以了。
vector<int> advantageCount(vector<int>& a, vector<int>& b) { int i,j,k,n,l; vector<pair<int,int> > bb; vector<int> ans; n=a.size(); for (i=0;i<n;i++) bb.push_back(make_pair(b[i],i)); for (i=0;i<n;i++) ans.push_back(-1); sort(a.begin(),a.end()); reverse(a.begin(),a.end()); sort(bb.begin(),bb.end()); reverse(bb.begin(),bb.end());//将A和B倒着排序 j=0; for (i=0;i<a.size();i++) { while ((j<bb.size())&&(bb[j].first>=a[i])) j++;//从头开始找刚好比A小的值 if (j==bb.size()) break; ans[bb[j].second]=a[i];//将对应位置放成A j++; } l=0; for (k=i;k<a.size();k++) { while ((l<ans.size())&&(ans[l]!=-1)) l++;//找到还没有放置元素的位置,随机放A中的剩下的元素 ans[l]=a[k]; l++; } return ans; }