原文地址:https://leetcode.com/problems/relative-ranks/
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”.
For the left two athletes, you just need to output their relative ranks according to their scores.
Note:
- N is a positive integer and won’t exceed 10,000.
- All the scores of athletes are guaranteed to be unique.
先对原数组进行一下排序,这样可以知道其对应的排名是啥,排好序以后,名次也知道了,然后再在原数组的基础上把排名填充一次就好了:
public class RelativeRanks {
public static String[] findRelativeRanks(int[] nums) {
String[] ranklist = new String[nums.length];
Map<Integer, Integer> map = new TreeMap<>();
for (int i = 0; i < nums.length; i++)
map.put(nums[i], 0);
int rank = map.size();
for (Map.Entry m : map.entrySet()) {
int i = 0;
for (; i < nums.length; i++) {
if ((int)m.getKey() != nums[i])
continue;
else
break;
}
String rankStr = "";
if (rank == 1) {
rankStr = "Gold Medal";
rank--;
} else if (rank == 2) {
rankStr = "Silver Medal";
rank--;
} else if (rank == 3) {
rankStr = "Bronze Medal";
rank--;
}
else {
rankStr = String.valueOf(rank--);
}
ranklist[i] = rankStr;
}
return ranklist;
}
public static void main(String[] args) {
int[] nums = {2,1};
String[] ranklist = findRelativeRanks(nums);
for (String s : ranklist)
System.out.print(s + ", ");
System.out.println();
}
}
在上述实现中,排序用了HashMap,然后根据排序结果,把每个分数的排名计算出来,然后拼装在rankList中。
以上实现时间复杂度略高,在 O(n2) 级别上。