题目描述:
给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。
运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:
名次第 1 的运动员获金牌 “Gold Medal” 。
名次第 2 的运动员获银牌 “Silver Medal” 。
名次第 3 的运动员获铜牌 “Bronze Medal” 。
从名次第 4 到第 n 的运动员,只能获得他们的名次编号(即,名次第 x 的运动员获得编号 “x”)。
使用长度为 n 的数组 answer 返回获奖,其中 answer[i] 是第 i 位运动员的获奖情况。
解题思路:
首先我们可以很明确的发现:
得分数组(score)和名次数组的输出是一一对应的关系即一种映射关系
所以我们很容易想到使用散列表这种数据结构来解题(在java中我们使用内置的HashMap()集合)。具体做法如下:
1.将score中的元素作为键,元素对应得索引作为下标依次存入到HashMap集合中;
2.我们对score从小到大排个序;
3.创建一个长度和score大小一样得结果数组
4.遍历排完序后的score在遍历时并同时定义int s = map.get(score[i])(即取出排序后score当前索引元素在没排序时得索引,我们之所以这样操作是为了便于最后对应原score中得数据一一将对应得排名输出)
5.若当前i == score.length - 1即排序后数组中得最大元素,即排名为"Gold Medal",同理依次有i == score.length - 2,排名为"Silver Medal",i == score.length - 3,排名为"Bronze Medal"。
6.若我们发现当前得不是前三名,则我们用score的长度减去排序后score当前元素的下标即为该元素的相对排名。
示例:
(1)排序前:我们依次在HashMap中存入:<10,0>,❤️,1>,<8,2>,<9,3>,<4,4>;
(2).排序后:我们遍历同时定义int s = map.get(score[i]);,对于排序后的score中的第一个元素3来说由于其不是前三名所以其相对排名为score.length - i(为5 - 0 = 5),对于元素8来说由于i == score.length - 3所以,其排名为"Bronze Medal"。
代码:
class Solution {
//HashMap
//Time Complexity: O(N)
//Space Complexity :O(N)
public String[] findRelativeRanks(int[] score) {
HashMap<Integer, Integer> map = new HashMap<>();
//将分数和索引添加到集合
for (int i = 0; i < score.length; i++) {
map.put(score[i],i);
}
//对score排序
Arrays.sort(score);
//创建结果集
String[] res = new String[socre.length];
for (int i = 0; i < score.length; i++) {
//获取下标
int s = map.get(score[i]);
if (i == score.length - 1) {
res[s] = "Gold Medal";
} else if (i == score.length - 2) {
res[s] = "Silver Medal";
} else if {
res[s] = "Bronze Medal";
} else {
res[s] = String.valueOf(score.length - i);
}
}
return res;
}
}