zoukankan      html  css  js  c++  java
  • leetcode-506-Relative Ranks

    题目描述:

    Given scores of N athletes, find their relative ranks and the people with the top three highest scores, who will be awarded medals: "Gold Medal", "Silver Medal" and "Bronze Medal".

    Example 1:

    Input: [5, 4, 3, 2, 1]
    Output: ["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"]
    Explanation: The first three athletes got the top three highest scores, so they got "Gold Medal", "Silver Medal" and "Bronze Medal". 
    For the left two athletes, you just need to output their relative ranks according to their scores.

     

    Note:

    1. N is a positive integer and won't exceed 10,000.
    2. All the scores of athletes are guaranteed to be unique.

     

    要完成的函数:

    vector<string> findRelativeRanks(vector<int>& nums) 

    说明:

    1、这道题给定一个vector,存放不同数值的分数,比如[2,4,3,5,1],输出是[“4”,“silver medal”,“bronze medal”,“gold medal”,“5”]。前三名比较特殊,后面输出数字的次序。

    2、传统思路快速处理,如下:

    先对给定vector排序,然后迭代一遍排序后的vector,建立每个数跟排序的对应表。

    最后对原本给定的vector,迭代一遍,输出每个数对应的次序,1/2/3名特殊处理。

    代码如下:

        vector<string> findRelativeRanks(vector<int>& nums) 
        {
            vector<int>nums1=nums;//存储一份副本
            sort(nums.begin(),nums.end(),greater<int>());//降序排列,改变nums的排序
            map<int,int>m1;//建立数值和次序的对应表
            for(int i=0;i<nums.size();i++)
                m1[nums[i]]=i+1;
            vector<string>res;
            for(int i=0;i<nums.size();i++)//对原本vector进行迭代
            {
                if(m1[nums1[i]]==1)
                    res.push_back("Gold Medal");
                else if(m1[nums1[i]]==2)
                    res.push_back("Silver Medal");
                else if(m1[nums1[i]]==3)
                    res.push_back("Bronze Medal");
                else
                    res.push_back(to_string(m1[nums1[i]]));
            }
            return res;
        }

    上述代码十分直观明了,非常暴力的手段,可想而知实测……

    23ms,beats 22.36% of cpp submissions。

    3、改进:

    我们先看看哪些步骤是必须的。排序是必须的,因为最后要输出每个数值的次序。建立副本是必须的,因为排序必然改变原来的vector。

    那我去掉建立map这个过程?去掉之后比如原本是[2,4,3,5,1],排完序是[5,4,3,2,1],我要找到5所在位置,更新值为"gold medal"?但这样做就是一个双重循环了。我们建立map,之后再插入也不过是两个单重循环。

    我们在做排序的时候可不可以记住这个数的位置,比如[2,4,3,5,1]我们简化成[0,1,2,3,4],然后降序排列成[5,4,3,2,1],其实按照位置来说也就是[3,1,2,0,4]。这样我们记住了大小,第三个数最大,第一个数第二大……也记住了它们的位置。

    这是一种可以参考的方法,注意看下这部分的代码实现。

    代码如下:

       vector<string> findRelativeRanks(vector<int>& nums) 
        {
            vector<int> rank;
            for(int i=0; i<nums.size(); ++i) rank.push_back(i);//插入位置0/1/2/3/4这样子
            sort(rank.begin(), rank.end(), [&](int a, int b){return nums[a] > nums[b];});//按照原本数值降序排列
    
            vector<string> ranks(nums.size());//最终要返回的vector        
            for(int i=3; i<nums.size(); ++i)
            {
                ranks[rank[i]] = std::to_string(i+1);
            }
            
            if(nums.size() > 0) ranks[rank[0]] = "Gold Medal";//边界情况
            if(nums.size() > 1) ranks[rank[1]] = "Silver Medal";
            if(nums.size() > 2) ranks[rank[2]] = "Bronze Medal";
            
            return ranks;
        }

    上述代码来源于leetcode用户@kevin36,实测13ms,beats 92.55% of cpp submissions。

  • 相关阅读:
    docker for zabbix
    由阿里云宕机引发的思考
    linux清空文件
    RDS导入注意事项
    coreos 常见问题
    2018年7月28日笔记
    2018年7月26日笔记
    2018年7月24日笔记
    作业五之系统设计时所实现的质量属性战术
    作业四之阅读《大型网站技术架构:核心原理与案例分析》第五、六、七章
  • 原文地址:https://www.cnblogs.com/chenjx85/p/8971921.html
Copyright © 2011-2022 走看看