题目描述:
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:
- N is a positive integer and won't exceed 10,000.
- 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名特殊处理。
代码如下:
vectorfindRelativeRanks(vector & nums) { vector nums1=nums;//存储一份副本 sort(nums.begin(),nums.end(),greater ());//降序排列,改变nums的排序 map m1;//建立数值和次序的对应表 for(int i=0;i res; for(int i=0;i
上述代码十分直观明了,非常暴力的手段,可想而知实测……
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]。这样我们记住了大小,第三个数最大,第一个数第二大……也记住了它们的位置。
这是一种可以参考的方法,注意看下这部分的代码实现。
代码如下:
vectorfindRelativeRanks(vector & nums) { vector rank; for(int i=0; i nums[b];});//按照原本数值降序排列 vector ranks(nums.size());//最终要返回的vector for(int i=3; i 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。