0506-相对名次

Raphael Liu Lv10

给你一个长度为 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 中的所有值 互不相同

方法一:排序

题目要求找到每个运动员的相对名次,并同时给前三名标记为 “Gold Medal”, “Silver Medal”, “Bronze Medal”,其余的运动员则标记为其相对名次。
将所有的运动员按照成绩的高低进行排序,然后将按照名次进行标记即可。

代码

[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public String[] findRelativeRanks(int[] score) {
int n = score.length;
String[] desc = {"Gold Medal", "Silver Medal", "Bronze Medal"};
int[][] arr = new int[n][2];

for (int i = 0; i < n; ++i) {
arr[i][0] = score[i];
arr[i][1] = i;
}
Arrays.sort(arr, (a, b) -> b[0] - a[0]);
String[] ans = new String[n];
for (int i = 0; i < n; ++i) {
if (i >= 3) {
ans[arr[i][1]] = Integer.toString(i + 1);
} else {
ans[arr[i][1]] = desc[i];
}
}
return ans;
}
}
[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& score) {
int n = score.size();
string desc[3] = {"Gold Medal", "Silver Medal", "Bronze Medal"};
vector<pair<int, int>> arr;

for (int i = 0; i < n; ++i) {
arr.emplace_back(make_pair(-score[i], i));
}
sort(arr.begin(), arr.end());
vector<string> ans(n);
for (int i = 0; i < n; ++i) {
if (i >= 3) {
ans[arr[i].second] = to_string(i + 1);
} else {
ans[arr[i].second] = desc[i];
}
}
return ans;
}
};
[sol1-C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Solution {
public string[] FindRelativeRanks(int[] score) {
int n = score.Length;
string[] desc = {"Gold Medal", "Silver Medal", "Bronze Medal"};
int[][] arr = new int[n][];

for (int i = 0; i < n; ++i) {
arr[i] = new int[2];
arr[i][0] = score[i];
arr[i][1] = i;
}
Array.Sort(arr, (a, b) => b[0] - a[0]);
string[] ans = new string[n];
for (int i = 0; i < n; ++i) {
if (i >= 3) {
ans[arr[i][1]] = (i + 1).ToString();
} else {
ans[arr[i][1]] = desc[i];
}
}
return ans;
}
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var findRelativeRanks = function(score) {
const n = score.length;
const desc = ["Gold Medal", "Silver Medal", "Bronze Medal"];
const arr = new Array(n).fill(0).map(() => new Array(2).fill(0));

for (let i = 0; i < n; ++i) {
arr[i][0] = score[i];
arr[i][1] = i;
}
arr.sort((a, b) => b[0] - a[0]);
const ans = new Array(n).fill(0);
for (let i = 0; i < n; ++i) {
if (i >= 3) {
ans[arr[i][1]] = '' + (i + 1);
} else {
ans[arr[i][1]] = desc[i];
}
}
return ans;
};
[sol1-Python3]
1
2
3
4
5
6
7
8
9
class Solution:
desc = ("Gold Medal", "Silver Medal", "Bronze Medal")

def findRelativeRanks(self, score: List[int]) -> List[str]:
ans = [""] * len(score)
arr = sorted(enumerate(score), key=lambda x: -x[1])
for i, (idx, _) in enumerate(arr):
ans[idx] = self.desc[i] if i < 3 else str(i + 1)
return ans
[sol1-Golang]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var desc = [3]string{"Gold Medal", "Silver Medal", "Bronze Medal"}

func findRelativeRanks(score []int) []string {
n := len(score)
type pair struct{ score, idx int }
arr := make([]pair, n)
for i, s := range score {
arr[i] = pair{s, i}
}
sort.Slice(arr, func(i, j int) bool { return arr[i].score > arr[j].score })

ans := make([]string, n)
for i, p := range arr {
if i < 3 {
ans[p.idx] = desc[i]
} else {
ans[p.idx] = strconv.Itoa(i + 1)
}
}
return ans
}

复杂度分析

  • 时间复杂度:O(n \log n),其中 n 为数组的长度。我们需要对数组进行一次排序,因此时间复杂度为 O(n \log n)。

  • 空间复杂度:O(n),其中 n 为数组的长度。

 Comments
On this page
0506-相对名次