LeetCode 506——相對名詞(排序+查詢)
阿新 • • 發佈:2021-02-16
技術標籤: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; } };