解析
使用希尔排序算法对运动员的成绩排序,建立出每位运动员的成绩和名次的映射关系。然后遍历整个数组,将每位运动员的成绩替换为名次即可。
class Solution {
public String[] findRelativeRanks(int[] nums) {
int[] arr = nums.clone();
shellSort(arr);
// 建立每位运动员的成绩和名次的映射关系
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
map.put(arr[i], i + 1);
}
String[] result = Arrays.stream(nums).mapToObj(String::valueOf).toArray(String[]::new);
for (int i = 0; i < nums.length; i++) {
if (nums[i] == arr[0]) result[i] = "Gold Medal";
else if (nums[i] == arr[1]) result[i] = "Silver Medal";
else if (nums[i] == arr[2]) result[i] = "Bronze Medal";
else result[i] = String.valueOf(map.get(nums[i]));
}
return result;
}
public static void shellSort(int[] arr) {
// 间隔序列,在希尔排序中我们称之为增量序列
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
// 从 gap 开始,按照顺序将每个元素依次向前插入自己所在的组
for (int i = gap; i < arr.length; i++) {
// currentNumber 站起来,开始找位置
int currentNumber = arr[i];
// 该组前一个数字的索引
int preIndex = i - gap;
while (preIndex >= 0 && currentNumber > arr[preIndex]) {
// 向后挪位置
arr[preIndex + gap] = arr[preIndex];
preIndex -= gap;
}
// currentNumber 找到了自己的位置,坐下
arr[preIndex + gap] = currentNumber;
}
}
}
}
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/sort-algorithms/etoahe/
来源:力扣(LeetCode)