• 506. Relative Ranks


    ▶ 给出一个数组,要求给出每个元素在排序以后的下标,并且给前三名金银铜牌。如输入 [ 4, 5, 1, 3, 0 ],则输出 [ 2, 1, 4, 3, 5 ],(得 5 分的第一名,的 4 分的第二名,以此类推) 。题目本身比较简单,但是思想比较重要。

    ● 代码,10 ms,使用数对记录下标,类似第 1 题中构造的那个结构,用其中一个数值来排序,另一个值记录了该值在原数组中的下标,用于将名次放回正确的位置上。

     1 class Solution
     2 {
     3 public:
     4     vector<string> findRelativeRanks(vector<int>& nums)
     5     {
     6         vector <pair <int, int> > scoreIdx;
     7         vector <string> ans(nums.size());
     8         int i;
     9         for (i = 0; i < nums.size(); ++i)
    10             scoreIdx.emplace_back(nums[i], i);
    11 
    12         sort(scoreIdx.begin(), scoreIdx.end());
    13         reverse(scoreIdx.begin(), scoreIdx.end());
    14 
    15         for (i = 0; i < nums.size(); ++i)
    16         {
    17             if (i == 0)
    18                 ans[scoreIdx[i].second] = "Gold Medal";
    19             else if (i == 1)
    20                 ans[scoreIdx[i].second] = "Silver Medal";
    21             else if (i == 2)
    22                 ans[scoreIdx[i].second] = "Bronze Medal";
    23             else
    24                 ans[scoreIdx[i].second] = to_string(i + 1);
    25         }
    26         return ans;
    27     }
    28 };

    ● 伴随排序,利用原数组的数值比较,对数组 rank = [ 1, 2, 3, ... , nums.size() ] 进行排序,排序后 rank[ i ] == j 表示 nums 中排第 i 的元素在原 nums 的第 j 个位置上。如下图的例子中,排序后 rank[ 0 ] == 4 表示 nums 中排第 0 的元素在原 nums 的第 4 个位置上,rank[ 2 ] == 3 表示 nums 中排第 2 的元素在原 nums 的第 3 个位置上。

      

    ● 代码,13 ms,在本题中,使用降序排序,且 rank 从 1 开始。

     1 class Solution
     2 {
     3 public:
     4     vector<string> findRelativeRanks(vector<int>& nums)
     5     {
     6         vector<int> rank(nums.size()); 
     7         vector<string> output(nums.size());
     8         int i;
     9         for (i = 0; i < nums.size(); rank[i] = i, i++);
    10         sort(rank.begin(), rank.end(), [&](int a, int b) {return nums[a] > nums[b]; });// 注意利用 nums 来对 rank 排序
    11         for (i = 3; i < nums.size(); i++)
    12             output[rank[i]] = to_string(i + 1);
    13         if (nums.size() > 0)
    14             output[rank[0]] = "Gold Medal";
    15         if (nums.size() > 1)
    16             output[rank[1]] = "Silver Medal";
    17         if (nums.size() > 2)
    18             output[rank[2]] = "Bronze Medal";
    19 
    20         return output;
    21     }
    22 };
  • 相关阅读:
    HDU 3374 String Problem(最小(大)表示 + KMP)
    HDU 1253 胜利大逃亡
    #include <cctype>
    HDU 4162 Shape Number(最小表示法)
    USACO section1.3 Mixing Milk 混合牛奶
    HDU 1572 下沙小面的(2)
    HDU 1969 Pie
    USACO section1.2 Milking Cows 挤牛奶(区间覆盖)
    HDU 2492 Ping pong (树状数组)
    筛选法打表:求某个数的素因子之和
  • 原文地址:https://www.cnblogs.com/cuancuancuanhao/p/8379344.html
Copyright © 2020-2023  润新知