zoukankan      html  css  js  c++  java
  • Leetcode(870)-优势洗牌

    给定两个大小相等的数组 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;
        }
  • 相关阅读:
    (8)route命令(每周一个linux命令系列)
    linux下怎么找到某些命令出自于哪个包
    centos网卡配置详解
    linux下查看系统版本
    (7)awk命令(每周一个linux命令系列)
    centos增加环境变量
    mysql用户操作、权限分配、远程登录设置
    (6)sudo命令详解(每周一个linux命令系列)
    最近的linux工作记录
    (5)ps详解 (每周一个linux命令系列)
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9317107.html
Copyright © 2011-2022 走看看