其他分享
首页 > 其他分享> > Leetcode 506: Relative Ranks

Leetcode 506: Relative Ranks

作者:互联网

问题描述:
在这里插入图片描述
解释说明:按照奥运会颁奖规则,从第一名开始以此为:金牌,银牌,铜牌,第四名,第五名。。。。返回一个数组,对应原数组运动员分数所对应的名次

涉及排序,考虑用优先队列。优先队列有不同的用法,这里我介绍一种新学到的方法–lambda 表达式法
lambda表达式可以在优先队列的comparator中表示排序的依据
例如: (o1,o2)->(o1,o2) 相当于没写,即默认的从小到大的排序, poll()每次弹出队列里面最小的元素
(o1,o2)->(o2,o1)相当于逆序,即从大到小排序,poll()每次弹出队列里面最大的元素
(o1,o2)->(score[o2], score[o1]) 表示o1,o2的排序原则不依据o1,o2本身的大小,而是根据他们在另外一个数组中作为数组下标所对应的数组元素值而从大到小排序。举例说明:score=[10,3,8,9,4], queue里面有(3,4)两个元素,比较3,4时,并不是直接比较字面上的3,4,而是3,4作为数组下标,在score里面找对应的9,4,因为score[3]>score[4], 所以3>4

代码如下:

class Solution {
    public String[] findRelativeRanks(int[] score) {
        PriorityQueue<Integer> queue=new PriorityQueue<>((o1,o2)->(score[o2]-score[o1]));
        for(int i=0; i<score.length; i++){
            queue.add(i);
        }
        String[] ans=new String[score.length];
        for(int i=0; i<score.length; i++){
            if(i==0){
                ans[queue.poll()]="Gold Medal";
            }
            else if(i==1){
                ans[queue.poll()]="Silver Medal";
            }
            else if(i==2){
                ans[queue.poll()]="Bronze Medal";
            }
            else{
                ans[queue.poll()]=Integer.toString(i+1);
            }
        }
        return ans;
    }
}

时间复杂度:O(nlogn)

标签:queue,Ranks,Relative,score,ans,506,poll,o2,o1
来源: https://blog.csdn.net/weixin_51401145/article/details/118724600