方法一,借助关联容器,此方法时间复杂度和空间复杂度都较高
1 class Solution 2 { 3 public: 4 vector<string> findRelativeRanks(vector<int>& nums) 5 { 6 int sz=nums.size(); 7 vector<int> copynums=nums; 8 sort(copynums.begin(),copynums.end()); 9 reverse(copynums.begin(),copynums.end()); 10 unordered_map<int,int> itoimap; 11 int rank=0; 12 for(int i:copynums) 13 itoimap[i]=++rank; 14 vector<string> res(sz); 15 for(int j=0;j<sz;j++) 16 { 17 if(itoimap[nums[j]]==1) 18 res[j]="Gold Medal"; 19 else if(itoimap[nums[j]]==2) 20 res[j]="Silver Medal"; 21 else if(itoimap[nums[j]]==3) 22 res[j]="Bronze Medal"; 23 else 24 res[j]=to_string(itoimap[nums[j]]); 25 } 26 return res; 27 } 28 };
方法二,核心思想是把分数当做下标,最大的分数下标最远。
新建一个容器,把分数作为下标,将该下标处的值置该分数在原容器中的位置。
之后从右到左扫描容器,顺序输出排名即可
1 static int wing=[]() 2 { 3 std::ios::sync_with_stdio(false); 4 cin.tie(NULL); 5 return 0; 6 }(); 7 8 class Solution 9 { 10 public: 11 vector<string> findRelativeRanks(vector<int>& nums) 12 { 13 int sz=nums.size(); 14 int maxnum=nums[0]; 15 for(int i:nums) 16 maxnum=max(maxnum,i); 17 vector<int> rankve(maxnum+1,-1); 18 for(int j=0;j<sz;j++) 19 rankve[nums[j]]=j; 20 int currank=1; 21 vector<string> res(sz); 22 for(int k=maxnum;k>=0;k--) 23 { 24 if(rankve[k]>=0) 25 { 26 if(currank==1) 27 res[rankve[k]]="Gold Medal"; 28 else if(currank==2) 29 res[rankve[k]]="Silver Medal"; 30 else if(currank==3) 31 res[rankve[k]]="Bronze Medal"; 32 else 33 res[rankve[k]]=to_string(currank); 34 currank++; 35 } 36 } 37 return res; 38 } 39 };
此方法时间复杂度和空间复杂度均较低。
浙公网安备 33010602011771号