leetcode 506. 相对名次

95 阅读1分钟

[toc] leetcode 506. 相对名次.

题目描述

给你一个长度为 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 位运动员的获奖情况。

 

示例 1:

输入:score = [5,4,3,2,1] 输出:["Gold Medal","Silver Medal","Bronze Medal","4","5"] 解释:名次为 [1st, 2nd, 3rd, 4th, 5th] 。 示例 2:

输入:score = [10,3,8,9,4] 输出:["Gold Medal","5","Bronze Medal","Silver Medal","4"] 解释:名次为 [1st, 5th, 3rd, 2nd, 4th] 。  

提示:

n == score.length 1 <= n <= 104 0 <= score[i] <= 106 score 中的所有值 互不相同

来源:力扣(LeetCode) 链接:leetcode.cn/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

法1

排序+hash
需要输出排名,我们可以所有排序算法快速得到排名,但是还要按原位置进行输出

所以我们可以增加一个map来映射位置,就是key为分数value为位置,我们就可以通过排名的分数找到获得该分数的人的位置

  • 时间复杂度(O(nlogn))
  • 空间复杂度(O(n))

执行结果

法1

func findRelativeRanks(score []int) []string {
	l := len(score)
	if l < 3 { //特殊情况:长度小于3时
		if l == 1 {
			return []string{"Gold Medal"}
		} else {
			if score[0] > score[1] {
				return []string{"Gold Medal", "Silver Medal"}
			} else {
				return []string{"Silver Medal", "Gold Medal"}
			}
		}
	}
	m := make(map[int]int) //增加映射
	for i := 0; i < l; i++ {
		m[score[i]] = i
	}
	sort.Ints(score) //排序
	r := make([]string, l)
	for i := 0; i < l-3; i++ {
		r[m[score[i]]] = fmt.Sprintf("%d", l-i) //赋值
	}
	r[m[score[l-3]]] = "Bronze Medal"
	r[m[score[l-2]]] = "Silver Medal"
	r[m[score[l-1]]] = "Gold Medal"
	return r
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 12 ms , 在所有 Go 提交中击败了 72.29% 的用户 内存消耗: 6.6 MB , 在所有 Go 提交中击败了 7.23% 的用户 通过测试用例: 17 / 17

本文由mdnice多平台发布