Loading

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;
    }
}
posted @ 2020-10-24 12:12  上海井盖王  阅读(58)  评论(0)    收藏  举报