持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
题目
给你一个长度为 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]
。
方法一:排序
思路及解法
题目要求找到每个运动员的相对名次,并同时给前三名标记为 "Gold Medal"
, "Silver Medal"
, "Bronze Medal"
,其余的运动员则标记为其相对名次。
将所有的运动员按照成绩的高低进行排序,然后将按照名次进行标记即可。
代码
class Solution {
func findRelativeRanks(_ score: [Int]) -> [String] {
var desc: [String] = ["Gold Medal", "Silver Medal", "Bronze Medal"]
var array: [Int] = score.sorted()
var map: [Int : Int] = [:]
let n = score.count
for i in 0..<n {
map[array[i]] = n - i
}
var ans: [String] = []
for num in score {
if map[num]! > 3 {
ans.append(String(map[num]!))
} else {
ans.append(desc[map[num]! - 1])
}
}
return ans
}
}
复杂度分析
-
时间复杂度:,其中 为数组的长度。我们需要对数组进行一次排序,因此时间复杂度为 。
-
空间复杂度:,其中 为数组的长度。