LeetCode算法题-Relative Ranks(Java实现)

避坑指南:ShardingSphere连接达梦/金仓数据库时SQL解析器的那些‘坑‘ 本文深入探讨了ShardingSphere与国产数据库(如达梦、金仓)集成时遇到的SQL解析器差异问题,提供了详细的解决方案和优化策略。通过分析SQL方言差异、JDBC实现差异及解析器兼容性,帮助开发者有效避坑,提升分布式数据库架构设计的效率与稳定性。 阅读详情

这是悦乐书的第248次更新,第261篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第115题(顺位题号是506)。根据N名运动员的得分,找到他们的相对等级和得分最高的三个人,他们将获得奖牌:“金牌”,“银牌”和“铜牌”。例如:

输入:[5,4,3,2,1]

输出:[“Gold Medal”,“Silver Medal”,“Bronze Medal”,“4”,“5”]

说明:前三名运动员获得前三名最高分,因此获得“Gold Medal”,“Silver Medal”和“Bronze Medal”。对于剩下的两名运动员,你只需要根据他们的分数输出他们的相对等级。

注意:

  • N是正整数,不超过10,000。

  • 所有运动员的得分都保证是独一无二的。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

这道题除了要排名外,还需要保持原来元素所在的位置不变,也就要求我们要把原数组中各元素的位置先保存起来。对此,我们可以使用HashMap来保存,key为元素值,value为其坐标。然后将数组排序,因为排序后是升序,所以需要我们反过来,从后往前开始排名,而新数组中的索引即为当前元素在map中的value值。

此解法的空间复杂度是O(n),时间复杂度是O(n log(n))。

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

03 第二种解法

对于上面的解法,我们可以使用一个新的数组来代替HashMap,将原来的数组复制一份出来,然后对复制出来的数组进行排序,然后遍历原数组的元素,使用二分法查找当前元素在复制数组中的索引,再使用数组长度减1后再减去该索引,得到当前元素的排名,然后按照金银铜以及名次的顺序依次写入字符串结果数组中去,并返回。

此解法的时间复杂度是O(n log2n),空间复杂度是O(n)。

public String[] findRelativeRanks2(int[] nums) {
    String[] arr = new String[nums.length];
    int[] copy = nums.clone();
    Arrays.sort(copy);
    for (int i=0; i< nums.length; i++) {
        int rank = nums.length - 1 - Arrays.binarySearch(copy, nums[i]);
        if (rank == 0) {
            arr[i] = "Gold Medal";
        } else if (rank == 1) {
            arr[i] = "Silver Medal";
        } else if (rank == 2) {
            arr[i] = "Bronze Medal";
        } else {
            arr[i] = (rank+1)+"";
        }
    }
    return arr;
}

04 第三种解法

我们也可以不对原数组进行排序,而使用一个新数组来保存原数组中各元素的索引值。

先遍历原数组找到最大元素的值,然后创建一个整型包装类数组,长度为最大值加1,然后再遍历一次原数组,新数组使用原数组的元素值作为索引,值为从0开始递增的整数。然后遍历新数组,因为新数组的长度是最大值加1,所以第一名肯定是新数组的最后一位元素。

因此我们从后往前开始遍历,同时还要借助一个新索引变量,作为结果数组的递增索引,如果当前元素不为null,并且新索引等于0,1,2,那么就按照金银铜的顺序写入结果数组,剩下的将新索引加1然后转为字符串写入结果数组即可。最后返回结果数组。

至于当中使用包装类来做数组(其原始值为null),是因为可以避免索引0的冲突,当然使用int(其原始值为0)也可以,但是需要在原索引的基础上加1,然后循环判断的时候就需要判断是否不等于0,在找到值后还需要再减1,还原成原来的索引值,而使用包装类就没这么麻烦。

此解法的时间复杂度是O(n),其中n为数组中最大元素的值,而非元素个数,因为使用了新数组,新数组的长度是数组中最大元素加1, 空间复杂度是O(n)。

public String[] findRelativeRanks3(int[] nums) {
    String[] arr = new String[nums.length];
    int max = -1;
    for (int num : nums) {
        if (num > max) {
            max = num;
        }
    }
    Integer[] numIndex = new Integer[max+1];
    for (int i=0; i<nums.length; i++) {
        numIndex[nums[i]] = i;
    }
    int index = 0;
    for (int i=numIndex.length-1; i>=0; i--) {
        if (numIndex[i] != null) {
            if (index == 0) {
                arr[numIndex[i]] = "Gold Medal";
            } else if (index == 1) {
                arr[numIndex[i]] = "Silver Medal";
            } else if (index == 2) {
                arr[numIndex[i]] = "Bronze Medal";
            } else {
                arr[numIndex[i]] = (index+1)+"";
            }
            index++;
        }
    }
    return arr;
}

05 小结

算法专题目前已日更超过三个月,算法题文章115+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

《网络安全自学教程》- 802.1x协议 802.1x协议架构,工作原理/认证流程,认证方式,MAB认证,触发认证的三种方式,EAP报文格式,EAPOL报文格式 阅读详情

相关推荐

深入MIPI DSI显示技术栈 (三) DSI vs CSI-2:孪生协议的本质差异

MIPI协议中的DSI与CSI-2存在本质差异:DSI为输出导向协议(Host→Display),用于屏幕控制和画面传输;CSI-2为输入导向协议(Sensor→Host),专攻图像采集。二者在包结构、同步机制、物理层优化等方面均有显著区别:DSI支持命令包和BLLP包,CSI-2具备嵌入式数据包;DSI时钟模式以Burst为主,CSI-2支持Continuous模式。典型场景中,二者协同工作(如手机相机预览),需注意时序同步和延迟控制。设计混合系统时,需合理规划虚拟通道和物理层资源,充分发挥这对&quot

GateWorld的博客 2109

lintcode 1200. 相对排名 priority_queue(队列自动升序排列)

根据N名运动员的得分,找到他们的相对等级和获得最高分前三名的人,他们将获得奖牌:“金牌”,“银牌”和“铜牌”。 样例 例子 1: 输入: [5, 4, 3, 2, 1] 输出: ["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"] 说明:前三名运动员获得前三名最高分,因此获得“金牌”,“银牌”和“铜牌”。 对于后两名运动员,你只需要根...

sinb妃的博客 475

Python爬虫实战:5分钟搞定东方财富A股数据抓取(附完整代码)

本文提供了一套基于Python的A股数据自动化采集与分析系统构建方案。文章详细解析了如何通过稳健的爬虫框架从东方财富等公开数据源高效抓取A股数据,并设计数据库进行自动化存储与管理,特别适合量化研究和数据分析场景。

weixin_29062963的博客 4443

【一次过】Lintcode 1200. 相对排名

根据N名运动员的得分,找到他们的相对等级和获得最高分前三名的人,他们将获得奖牌:“金牌”,“银牌”和“铜牌”。 样例 例子 1: 输入: [5, 4, 3, 2, 1] 输出: ["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"] 说明:前三名运动员获得前三名最高分,因此获得“金牌”,“银牌”和“铜牌”。 对于右边两名运动员,你只...

majichen95的博客 463

MQL5教程 01 MT5有关EA的操作、MetaEditor 工具栏主要功能

MQL5教程 01 MT5有关EA的操作、MetaEditor 工具栏主要功能

weixin_42830015的博客 3991

IC618新手避坑指南:从零在Linux上配置Cadence Virtuoso环境(含cds.lib文件详解)

本文详细介绍了在Linux系统上配置Cadence Virtuoso IC618环境的完整指南,特别针对新手常见问题提供解决方案。重点解析了cds.lib文件的关键配置,包括库路径定义和工艺库管理,并分享了高效工作流设置和典型问题排查技巧,帮助工程师快速搭建稳定的EDA设计环境。

weixin_26805597的博客 557

1200 · 相对排名

描述 根据N名运动员的得分,找到他们的相对等级和获得最高分前三名的人,他们将获得奖牌:“金牌”,“银牌”和“铜牌”。 N是正整数,并且不超过10,000。 所有运动员的成绩都保证是独一无二的。 样例 例子 1: 输入: [5, 4, 3, 2, 1] 输出: ["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"] 说明:前三名运动员获得前三名最高分,因此获得“金牌”,“银牌”和“铜牌”。 对于后两名运动员,你只需要根据他们的分数输出他

softstarhhy的专栏 218

CMOS图像传感器——工作原理

CMOS图像传感器的曝光与读出

沧海一升的博客 9461

相对名次 力扣题目

给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌。前三名运动员将会被分别授予 “金牌”,“银牌” 和“ 铜牌”(“Gold Medal”, “Silver Medal”, “Bronze Medal”)。 (注:分数越高的选手,排名越靠前。) 示例 1: 输入: [5, 4, 3, 2, 1] 输出: [“Gold Medal”, “Silver Medal”, “Bronze Medal”, “4”, “5”] 解释: 前三名运动员的成绩为前三高的,因此将会分别被授予 “金牌”,“银牌”

weixin_46558883的博客 276

手把手教你学Simulink--进阶电机控制场景实例:基于Simulink的直流电机双闭环调速系统抗负载扰动仿真

摘要:本文基于Simulink平台构建直流电机双闭环调速系统,重点研究其在工业传送带场景下的抗负载扰动性能。系统采用转速外环(稳速)和电流内环(限流)的嵌套结构,通过工程法整定PI参数,实现了转速跌落<10%、恢复时间<0.5s的优异抗扰性能。仿真结果表明,相比单闭环系统,双闭环控制使转速跌落率降低47%,恢复时间缩短75%。文中详细介绍了数学模型建立、Simulink模块实现及参数优化方法,并提供了完整代码和模型文件,为电机控制系统设计提供实用参考。

MHD0815的博客 181

QGIS004:【05矢量属性表】-保留字段、删除字段、添加唯一值索引字段、添加字段到属性表、添加自增量字段、添加XY字段到图层、文本型转浮点型、重构字段、重命名字段

摘要:QGIS矢量属性表工具箱包括保留字段、删除字段、添加唯一值索引字段、添加字段到属性表、添加自增量字段、添加XY字段到图层、文本型转浮点型、重构字段、重命名字段等选项,本文介绍各选项的基本操作。

qq_31762031的博客 2313

LeetCode - 506. Relative Ranks

链接 506. Relative Ranks 题意 给定N个运动员的成绩,输出他们对应的排名。前三名输出格式为:"Gold Medal", "Silver Medal", "Bronze Medal",其他成绩输出名次即可。 思路 拷贝一份数组 将数组的值和下标最为key和value存入map 对其中一数组排序 根据map获得原数组该元素下标,设值即可 代码 Java : publi...

150

ArcGIS实验教程——实验十九:网络分析(最短路径实现)

一、实验描述 网络分析模块用于实现基于网络数据集的网络分析功能,包括路径分析、服务区分析、最近设施点分析、OD成本矩阵分析、多路径配送分析、位置分配分析和高级网络的管理与创建等。 网络数据集不同于几何网络,是一种高级的连接模型,能够展示复杂的细节,拥有丰富的网络属性模型,可以模拟网络阻力、网络限制以及网络层次等。 本实验重点演示网络分析中最短路径的实现过程。 二、实验内容 1、网络数据集...

智慧空间实验室 5686

leetcode506: Relative Ranks

Given scores of N athletes, find their relative ranks and the people with the top three highest scores, who will be awarded medals: "Gold Medal", "Silver Medal" and "Bronze Medal". Example 1: In

sinat_35425429的博客 1020

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Relative Ranks

原文地址:https://leetcode.com/problems/relative-ranks/Given scores of N athletes, find their relative ranks and the people with the top three highest scores, who will be awarded medals: “Gold Medal”, “Silv

K.Sun 869

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Leetcode】506. Relative Ranks

题目地址: https://leetcode.com/problems/relative-ranks/ 给定一个整型数组AAA,要求返回一个字符串数组BBB,其中B[i]B[i]B[i]是A[i]A[i]A[i]在AAA中的排名,其中前三名要分别替换为"Gold Medal",Silver Medal和Bronze Medal,其余就直接返回排名。 先把AAA拷贝一份,然后将拷贝的数组排序,并用哈希表记录排名,接着遍历AAA将每个位置的排名取出即可。代码如下: import java.util.Arrays

数学、算法爱好者的博客 240

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode-506. Relative Ranks (Java)

通过引入新数组,高效解决问题

NOadu的专栏 703

【LeetCode】506. Relative Ranks 相对名次

LeetCode,506,相对名次,排序数组 给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。 运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况: 名次第 1 的运动员获金牌 "Gold Medal" 。 名次第 2 的运动员获银牌 "Silver Medal" 。 名次第 3 的运动员获铜牌 "Bronze Medal" 。

负雪明烛 1910

[Leetcode] 506. Relative Ranks

Question First thought, copy array -> sort array -> reverse sorted array -> nested loop, outer loop go through sorted array, inner loop go through original array and assign value to result when ele

伪技回忆录 505

LeetCode 506. Relative Ranks

LeetCode 506. Relative Ranks (Easy) 主要知识点:sorting,comparator写法;优先级:1

温迪今天刷题了吗 204

leetcode 506. Relative Ranks

Given scores of N athletes, find their relative ranks and the people with the top three highest scores, who will be awarded medals: "Gold Medal", "Silver Medal" and "Bronze Medal". Example 1: In

淡然坊 316

LeetCode 506. 相对名次(Relative Ranks) 39

506. 相对名次 506. Relative Ranks 题目描述 给出N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌。前三名运动员将会被分别授予“金牌”,“银牌”和“铜牌”("Gold Medal", "Silver Medal", "Bronze Medal")。 (注: 分数越高的选手,排名越靠前。) 每日一算法2019/6/11Day 39LeetCode506. Rel...

weixin_30908707的博客 172

LeetCode-506. Relative Ranks

问题:https://leetcode.com/problems/relative-ranks/?tab=Description Given scores of N athletes, find their relative ranks and the people with the top three highest scores, who will be awarded medals: “Go

Renzhouzhou的博客 323

《中英双解》leetcode Relative Ranks(相对名次)

506. Relative Ranks 难度简单170收藏分享切换为中文接收动态反馈 You are given an integer arrayscoreof sizen, wherescore[i]is the score of theithathlete in a competition. All the scores are guaranteed to beunique. The athletes areplacedbased on their scores, where...

weixin_46272350的博客 265

(Easy) Relative Ranks - LeetCode

Description: Given scores of N athletes, find their relative ranks and the people with the top three highest scores, who will be awarded medals: "Gold Medal", "Silver Medal" and "Bronze Medal"...

weixin_30247159的博客 105

LeetCode Relative Ranks

原题链接在这里:https://leetcode.com/problems/relative-ranks/#/description 题目: Given scores ofNathletes, find their relative ranks and the people with the top three highest scores, who will be awarded med...

weixin_30485291的博客 81
上一篇: LeetCode算法题-Base 7(Java实现)
下一篇: LeetCode算法题-Perfect Number(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值