首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode-506-Relative Ranks

leetcode-506-Relative Ranks

作者头像
chenjx85
发布2018-05-22 16:25:16
4770
发布2018-05-22 16:25:16
举报

题目描述:

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。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 要完成的函数:
  • 说明:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档