力扣506.相对名次(HashMap + 排序方法)

题目描述:

给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。

运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:

名次第 1 的运动员获金牌 “Gold Medal” 。
名次第 2 的运动员获银牌 “Silver Medal” 。
名次第 3 的运动员获铜牌 “Bronze Medal” 。
从名次第 4 到第 n 的运动员,只能获得他们的名次编号(即,名次第 x 的运动员获得编号 “x”)。
使用长度为 n 的数组 answer 返回获奖,其中 answer[i] 是第 i 位运动员的获奖情况。

在这里插入图片描述

解题思路:

首先我们可以很明确的发现:

得分数组(score)和名次数组的输出是一一对应的关系即一种映射关系

所以我们很容易想到使用散列表这种数据结构来解题(在java中我们使用内置的HashMap()集合)。具体做法如下:

1.将score中的元素作为键,元素对应得索引作为下标依次存入到HashMap集合中;
2.我们对score从小到大排个序;
3.创建一个长度和score大小一样得结果数组
4.遍历排完序后的score在遍历时并同时定义int s = map.get(score[i])(即取出排序后score当前索引元素在没排序时得索引,我们之所以这样操作是为了便于最后对应原score中得数据一一将对应得排名输出)
5.若当前i == score.length - 1即排序后数组中得最大元素,即排名为"Gold Medal",同理依次有i == score.length - 2,排名为"Silver Medal",i == score.length - 3,排名为"Bronze Medal"。
6.若我们发现当前得不是前三名,则我们用score的长度减去排序后score当前元素的下标即为该元素的相对排名。

示例:

在这里插入图片描述
(1)排序前:我们依次在HashMap中存入:<10,0>,❤️,1>,<8,2>,<9,3>,<4,4>;
在这里插入图片描述
(2).排序后:我们遍历同时定义int s = map.get(score[i]);,对于排序后的score中的第一个元素3来说由于其不是前三名所以其相对排名为score.length - i(为5 - 0 = 5),对于元素8来说由于i == score.length - 3所以,其排名为"Bronze Medal"。

代码:

class Solution {
	//HashMap
	//Time Complexity: O(N)
	//Space Complexity :O(N)
	public String[] findRelativeRanks(int[] score) {
		HashMap<Integer, Integer> map = new HashMap<>();
		//将分数和索引添加到集合
		for (int i = 0; i < score.length; i++) {
			map.put(score[i],i);
		}
		//对score排序
		Arrays.sort(score);
		//创建结果集
		String[] res = new String[socre.length];
		for (int i = 0; i < score.length; i++) {
			//获取下标
			int s = map.get(score[i]);
			if (i == score.length - 1) {
				res[s] = "Gold Medal";
			} else if (i == score.length - 2) {
				res[s] = "Silver Medal";
			} else if {
				res[s] = "Bronze Medal";
			} else {
				res[s] = String.valueOf(score.length - i);
			}
		}
		return res;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值