vector<string> findRelativeRanks(vector<int>& vec) {
vector<string> res;
unordered_map<int,string>m;
vector<int> nums=vec;
sort(nums.begin(),nums.end());
int len=nums.size();
for(int i=len-1;i>=0;--i){
if(i==len-1) m[nums[i]]="Gold Medal";
else if(i==len-2) m[nums[i]]="Silver Medal";
else if(i==len-3) m[nums[i]]="Bronze Medal";
else m[nums[i]]=to_string(len-i);
}
for(auto a:vec){
res.push_back(m[a]);
}
return res;
}
用一个优先队列存放分数和位置,优先队列会根据分数从高到低排好序。再根据位置将相应的排名放到res中。
vector<string> findRelativeRanks(vector<int>& nums) {
int n=nums.size();
vector<string> res(n,"");
priority_queue<pair<int,int>> q;
for(int i=0;i<nums.size();i++){
q.push({nums[i],i});
}
for(int i=1;i<=n;++i){
int idx=q.top().second;q.pop();
if(i==1) res[idx]="Gold Medal";
else if(i==2) res[idx]="Silver Medal";
else if(i==3) res[idx]="Bronze Medal";
else res[idx]=to_string(i);
}
return res;
}
pair讲解
priority_queue讲解
利用map的自动排序,从低到高排序。
vector<string> findRelativeRanks(vector<int>& nums) {
map<int ,int>m;
int n=nums.size();
for(int i=0;i<n;i++){
m[nums[i]]=i;
}
vector<string>res(n,"");
int cnt=1;
for(auto a=m.rbegin();a!=m.rend();++a){
if(cnt==1) res[a->second]="Gold Medal";
else if(cnt==2)res[a->second]="Silver Medal";
else if(cnt==3)res[a->second]="Bronze Medal";
else res[a->second]=to_string(cnt);
++cnt;
}
return res;
}
idx中存放排名和索引的信息,idx的索引代表从高到低的排名。
vector<string> findRelativeRanks(vector<int>& nums) {
int n=nums.size();
vector<string>res(n,"");
vector<int>idx(n);
for(int i=0;i<n;i++) idx[i]=i;
sort(idx.begin(),idx.end(),[&](int a,int b){return nums[a]>nums[b];});
for(int i=0;i<n;i++){
if(i==0) res[idx[i]]="Gold Medal";
else if(i==1) res[idx[i]]="Silver Medal";
else if(i==2) res[idx[i]]="Bronze Medal";
else res[idx[i]]=to_string(i+1);
}
return res;
}