题目
思路
1.暴力解法,另外定义一个数组来判断名次
2.使用map(一开始有这个想法但是map使用太不熟练了)
3.评论里面的想法,通过位置来反映名次,数字几就在第几位标上对应的下标即可
相关思考
方法3是提交后显示性能最好的,空间和时间耗费都比较少,但是按照原理来看,如果给的数字比较稀疏的情况下,空间换时间的策略并不划算。(ps:自己编写的总是显示数组越界,需要之后查一下是哪里不对)
代码(C++/原创)
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& score) {
vector<int> temp(score);
vector<string> ans;
sort(temp.begin(),temp.end());
for(int i=0;i<score.size();i++)
{
for(int j=0;j<temp.size();j++)
{
if(score[i]==temp[j])
{
if(j==temp.size()-1) ans.push_back("Gold Medal");
else if(j==temp.size()-2) ans.push_back("Silver Medal");
else if(j==temp.size()-3) ans.push_back("Bronze Medal");
else{
string position=to_string(temp.size()-j);
ans.push_back(position);
}
}
}
}
return ans;
}
};
代码(C++/力扣)
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& score) {
vector<int> t=score;
map<int,int> m2;
vector<string> res;
sort(score.begin(),score.end(),greater<int>());
for(int i=0;i<score.size();i++)
m2[score[i]]=i;
for(int i=0;i<t.size();i++){
if(m2[t[i]]==0)
res.push_back("Gold Medal");
else if(m2[t[i]]==1)
res.push_back("Silver Medal");
else if(m2[t[i]]==2)
res.push_back("Bronze Medal");
else
res.push_back(to_string(m2[t[i]]+1));
}
return res;
}
};
代码(C++/力扣)
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& score) {
int max_score = *max_element(score.begin(), score.end()); //获取分数的最大值
vector<int> index(max_score + 1, -1); // 申请一个包含max+1个全是-1的数组
for(int i = 0; i < score.size(); i++){
index[ score[i] ] = i; // 把该元素对应的下标处的值置为在原始数组中的索引下标
}
vector<string> ret(score.size()," ");//存放输出结果
int rank = score.size(); //排名
int j = 0 ; //index数组的下标。
while(rank > 0){
if(index[j] != -1){
if(rank == 1) { ret[index[j]] = "Gold Medal"; }
else if(rank == 2){ ret[index[j]] = "Silver Medal"; }
else if(rank == 3){ ret[index[j]] = "Bronze Medal"; }
else{ ret[index[j]] = to_string(rank); }
rank --;
}
j++;
}
return ret;
}
};