给定两个大小相等的数组 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;
    }
posted on 2018-07-16 12:35  Mini_Coconut  阅读(360)  评论(0编辑  收藏  举报