ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

506. Relative Ranks

2019-02-22 11:50:59  阅读:294  来源: 互联网

标签:String nums int else Relative Ranks result 506 Medal


给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌。前三名运动员将会被分别授予 “金牌”,“银牌” 和“ 铜牌”("Gold Medal", "Silver Medal", "Bronze Medal")。

(注:分数越高的选手,排名越靠前。)

示例 1:

输入: [5, 4, 3, 2, 1]
输出: ["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"]
解释: 前三名运动员的成绩为前三高的,因此将会分别被授予 “金牌”,“银牌”和“铜牌” ("Gold Medal", "Silver Medal" and "Bronze Medal").
余下的两名运动员,我们只需要通过他们的成绩计算将其相对名次即可。

提示:

  1. N 是一个正整数并且不会超过 10000。
  2. 所有运动员的成绩都不相同。

=====================================================================

Review:

第一反应是使用哈希表去储存分数与原位置的对应关系,排序后使用分数进行查找

或者排序后进行二分查找(这个会慢一些)

class Solution {
    public String[] findRelativeRanks(int[] nums) {
        final HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i],i);
        }
        Arrays.sort(nums);
        String[] result = new String[nums.length];
        for (int i = nums.length-1,p=1; i > -1; i--,p++) {
            if (p==1){
                result[map.get(nums[i])] = "Gold Medal";
            }else if(p==2){
                result[map.get(nums[i])] = "Silver Medal";
            }else if(p==3){
                result[map.get(nums[i])] = "Bronze Medal";
            }else {
                result[map.get(nums[i])] = String.valueOf(p);
            }
        }
        return result;
    }
}

确实很简单,但是仔细想一下,这种key和value都为数字的可以避免使用hashtable 而转用数组index

那要怎么做呢?

我们可以定义一个数组, arr[ i ]元素用来储存原数组的确切位置信息,并且不改变原数组大小排列

即一个元素携带两个信息:数组下标,大小

最简单的方法就是拼接 比方说nums数组下标为5的上面值为666,那么我们可以用6660005 (个数N最大为10000)

这样我们可以对储存这种数的新数组arr进行排序,对6660005 % 10000就可以得到下标5

为了速度更快,可以使用位运算

下面是代码

========================================================

Code:

    public String[] findRelativeRanks(int[] nums) {
        final int len = nums.length;
        int digit = 1;
        while (len >> digit != 0) {
            digit++;
        }
        final long[] record = new long[len];
        for (int i = 0; i < len; i++) {
            record[i] = (long) (nums[i] << digit) + i;
        }
        Arrays.sort(record);
        String[] result = new String[len];
        int p = (1 << digit) - 1;
        for (int i = len - 1, rak = 1; i > -1; i--, rak++) {
            if (rak == 1) {
                result[(int) (record[i] & p)] = "Gold Medal";
            } else if (rak == 2) {
                result[(int) (record[i] & p)] = "Silver Medal";
            } else if (rak == 3) {
                result[(int) (record[i] & p)] = "Bronze Medal";
            } else {
                result[(int) (record[i] & p)] = String.valueOf(rak);
            }
        }
        return result;
    }

要比哈希方法快一倍

顺便吐槽一下leetcode ,更新了内存消耗后所有提交都比原来慢了许多

原本提交的答案变成了不可超越的神话???

为啥第一名 new int[99999999] 不报超内存??

拿不到100%好心塞啊

标签:String,nums,int,else,Relative,Ranks,result,506,Medal
来源: https://blog.csdn.net/start_lie/article/details/87875165

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有