506. [字符串][排序]相对名次
506. 相对名次
因为需要找出 \(N\) 名运动员的相对成绩,首先能想到的策略就是 排序,排序的依据应该是 成绩,排序的对象是 成绩所对的下标。
方法一:TreeMap排序成绩
// 执行用时: 12 ms , 在所有 Java 提交中击败了 52.43% 的用户
// 内存消耗: 40 MB , 在所有 Java 提交中击败了 38.15% 的用户
class Solution {
public String[] findRelativeRanks(int[] nums) {
int len = nums.length;
String[] ans = new String[len];
TreeMap<Integer, Integer> treeMap = new TreeMap<>();
for(int i = 0; i < nums.length; i++){
treeMap.put(nums[i], i);
}
List<Integer> rank = new ArrayList<Integer>(treeMap.keySet());
int cnt = 1;
… for(int i = len - 1; i >= 0; i--){
if (cnt == 1){
ans[treeMap.get(rank.get(i))] = "Gold Medal";
} else if (cnt == 2){
ans[treeMap.get(rank.get(i))] = "Silver Medal";
} else if (cnt == 3){
ans[treeMap.get(rank.get(i))] = "Bronze Medal";
} else {
ans[treeMap.get(rank.get(i))] = Integer.toString(cnt);
}
cnt++;
}
return ans;
}
}
方法二:快速排序
JDK7 以后,Arrays.sort(int[] a) 使用的是 Dual-Pivot QuickSort,取代了以前使用的 经典快速排序。它是俄罗斯人Vladimir Yaroslavskiy在2009年开发出来的,所谓的 Dual-Pivot 其实就是用两个 Pivot, 把整个数组分成三份,其余与经典快排的思路类似。从元素比较次数来看的话, Dual-Pivot 快排元素比较次数其实比经典快排要多,但由于CPU与内存的发展失衡,我们在分析算法复杂性的时候,已经不能简单地用元素比较次数来比较了,因为这种比较的方法只考虑了CPU的因素,没有考虑内存的因素。对于那种对输入数据进行顺序扫描的排序算法,扫描元素的个数这种新的算法把内存的流量的因素考虑进去,比较适应新时代。
// 执行用时: 4 ms , 在所有 Java 提交中击败了 96.39% 的用户
// 内存消耗: 39.8 MB , 在所有 Java 提交中击败了 79.12% 的用户
class Solution {
public String[] findRelativeRanks(int[] nums) {
String[] res = new String[nums.length];
// 特殊情况进行处理
if(nums.length == 1) {
res[0] = "Gold Medal";
return res;
}
if(nums.length == 2) {
if(nums[0] > nums[1]) {
res[0] = "Gold Medal";
res[1] = "Silver Medal";
} else {
res[1] = "Gold Medal";
res[0] = "Silver Medal";
}
return res;
}
// 找出最大元素
int max = nums[0];
for(int i = 0; i < nums.length; i++) {
if(nums[i] > max) {
max = nums[i];
}
}
// 对元素下标进行存储
// site数组下标为nums[i]的位置上存储的为nums[i]这个数字在nums数组中下标
int[] site = new int[max + 1];
for(int i = 0; i < nums.length; i++) {
site[nums[i]] = i;
}
Arrays.sort(nums);
// 将名次存入数组中
res[site[nums[nums.length - 1]]] = "Gold Medal";
res[site[nums[nums.length - 2]]] = "Silver Medal";
res[site[nums[nums.length - 3]]] = "Bronze Medal";
int rank = nums.length;
for(int i = 0; i < nums.length - 3; i++) {
res[site[nums[i]]] = String.valueOf(rank);
rank--;
}
return res;
}
}

浙公网安备 33010602011771号