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".思路:对于给予的得分情况,找出前三名并给予相应的称号,其余以数字作为其名词,利用优先队列进行记录每个元素的位置和元素值,优先队列的特点是top始终是所有元素中最大的那个。
For the left two athletes, you just need to output their relative ranks according to their scores.
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& nums) {
vector<string> res(nums.size());
priority_queue<pair<int,int>> temp;
for(size_t i=0,len=nums.size();i<len;++i)
temp.push({nums[i],i});
int count=1;
while(temp.size())
{
auto elem=temp.top();
temp.pop();
if(count==1)
res[elem.second]="Gold Medal";
else if(count==2)
res[elem.second]="Silver Medal";
else if(count==3)
res[elem.second]="Bronze Medal";
else
res[elem.second]=to_string(count);
++count;
}
return res;
}
};
第二种方法,可以用map来解决,将nums中的元素值作为map的index从而实现将nums排序,同时保存nums的index到map中
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& nums) {
vector<string> res(nums.size());
map<int,int>ma;
for(int i=0;i!=nums.size();++i)
ma[nums[i]]=i;
int count=1;
for(map<int,int>::reverse_iterator it=ma.rbegin();it!=ma.rend();++it,++count)
{
if(count==1)
res[it->second]="Gold Medal";
else if(count==2)
res[it->second]="Silver Medal";
else if(count==3)
res[it->second]="Bronze Medal";
else
res[it->second]=to_string(count);
}
return res;
}
};