1. 程式人生 > 其它 >LeetCode 506——相對名詞(排序+查詢)

LeetCode 506——相對名詞(排序+查詢)

技術標籤:LeetCode刷題

一、題目介紹

給出N 名運動員的成績,找出他們的相對名次並授予前三名對應的獎牌。前三名運動員將會被分別授予 “金牌”,“銀牌” 和“ 銅牌”("Gold Medal", "Silver Medal", "Bronze Medal")。

(注:分數越高的選手,排名越靠前。)

示例 1:

輸入: [5, 4, 3, 2, 1]
輸出: ["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"]
解釋: 前三名運動員的成績為前三高的,因此將會分別被授予 “金牌”,“銀牌”和“銅牌” ("Gold Medal", "Silver Medal" and "Bronze Medal").
餘下的兩名運動員,我們只需要通過他們的成績計算將其相對名次即可。
提示:

N 是一個正整數並且不會超過10000。
所有運動員的成績都不相同。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/relative-ranks
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

二、解題思路

本題需要事先清楚一點,輸出陣列的元素內容,要與輸入陣列對應,且不能更改輸入陣列原本的順序。具體解決方案如下:

(1)將輸入陣列拷貝一份tmpVec,並對拷貝的陣列進行排序(降序排列)。

(2)記錄排序後的陣列tmpVec中,各個元素值的索引位置,這裡使用map資料結構完成。

(3)遍歷給定陣列nums,遍歷過程中在map中查詢當前元素所對應的值(即排列名次)。

三、解題程式碼


bool cmp(int a, int b)
{
    return a > b;
}

class Solution {
public:
    vector<string> findRelativeRanks(vector<int>& nums) {
        //本題需要理解題意,輸出的陣列需要對應輸入的陣列,只能將元素的內容更改為名詞,相對順序不能發生改變
        //排序+查詢(map)
        vector<int> tmpVec = nums;
        sort(tmpVec.begin(), tmpVec.end(), cmp);

        map<int, int> mp;
        for(int i = 0; i < tmpVec.size(); ++i)
        {
            mp[tmpVec[i]] = i+1;
        }

        vector<string> res;
        for(int i = 0; i < nums.size(); ++i)
        {
            int index = mp[nums[i]];
            if(index == 1) 
                res.push_back("Gold Medal");
            else if(index == 2)
                res.push_back("Silver Medal");
            else if(index == 3)
                res.push_back("Bronze Medal");
            else
                res.push_back(to_string(index));
        }
        return res;
    }
};

四、解題結果