题目描述
给你一个不同学生的分数列表 items
,其中 items[i] = [IDi, scorei]
表示 IDi
的学生的一科分数,你需要计算每个学生 最高的五科 成绩的 平均分。
返回答案 result
以数对数组形式给出,其中 result[j] = [IDj, topFiveAveragej]
表示 IDj
的学生和他 最高的五科 成绩的 平均分。result
需要按 IDj
递增的 顺序排列 。
学生 最高的五科 成绩的 平均分 的计算方法是将最高的五科分数相加,然后用 整数除法 除以 5 。
示例 1:
输入:items = [[1,91],[1,92],[2,93],[2,97],[1,60],[2,77],[1,65],[1,87],[1,100],[2,100],[2,76]]
输出:[[1,87],[2,88]]
解释:
ID = 1 的学生分数为 91、92、60、65、87 和 100 。前五科的平均分 (100 + 92 + 91 + 87 + 65) / 5 = 87
ID = 2 的学生分数为 93、97、77、100 和 76 。前五科的平均分 (100 + 97 + 93 + 77 + 76) / 5 = 88.6,但是由于使用整数除法,结果转换为 88
示例 2:
输入:items = [[1,100],[7,100],[1,100],[7,100],[1,100],[7,100],[1,100],[7,100],[1,100],[7,100]]
输出:[[1,100],[7,100]]
提示:
1 <= items.length <= 1000
items[i].length == 2
1 <= IDi <= 1000
0 <= scorei <= 100
- 对于每个
IDi
,至少 存在五个分数
解法
方法一:排序
我们先用一个哈希表或数组 $d$ 记录每个学生的分数列表,然后从小到大遍历学生的编号,对于每个学生,我们将他的分数列表排序,然后取最高的五个分数求平均值即可。
时间复杂度 $O(n \log n)$,空间复杂度 $O(n)$。其中 $n$ 是学生的数量。
1
2
3
4
5
6
7
8
9
10
11
12
13 | class Solution:
def highFive(self, items: List[List[int]]) -> List[List[int]]:
d = defaultdict(list)
m = 0
for i, x in items:
d[i].append(x)
m = max(m, i)
ans = []
for i in range(1, m + 1):
if xs := d[i]:
avg = sum(nlargest(5, xs)) // 5
ans.append([i, avg])
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | class Solution {
public int[][] highFive(int[][] items) {
int size = 0;
PriorityQueue[] s = new PriorityQueue[101];
int n = 5;
for (int[] item : items) {
int i = item[0], score = item[1];
if (s[i] == null) {
++size;
s[i] = new PriorityQueue<>(n);
}
s[i].offer(score);
if (s[i].size() > n) {
s[i].poll();
}
}
int[][] res = new int[size][2];
int j = 0;
for (int i = 0; i < 101; ++i) {
if (s[i] == null) {
continue;
}
int avg = sum(s[i]) / n;
res[j][0] = i;
res[j++][1] = avg;
}
return res;
}
private int sum(PriorityQueue<Integer> q) {
int s = 0;
while (!q.isEmpty()) {
s += q.poll();
}
return s;
}
}
|
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<vector<int>> highFive(vector<vector<int>>& items) {
vector<int> d[1001];
for (auto& item : items) {
int i = item[0], x = item[1];
d[i].push_back(x);
}
vector<vector<int>> ans;
for (int i = 1; i <= 1000; ++i) {
if (!d[i].empty()) {
sort(d[i].begin(), d[i].end(), greater<int>());
int s = 0;
for (int j = 0; j < 5; ++j) {
s += d[i][j];
}
ans.push_back({i, s / 5});
}
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | func highFive(items [][]int) (ans [][]int) {
d := make([][]int, 1001)
for _, item := range items {
i, x := item[0], item[1]
d[i] = append(d[i], x)
}
for i := 1; i <= 1000; i++ {
if len(d[i]) > 0 {
sort.Ints(d[i])
s := 0
for j := len(d[i]) - 1; j >= len(d[i])-5; j-- {
s += d[i][j]
}
ans = append(ans, []int{i, s / 5})
}
}
return ans
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | function highFive(items: number[][]): number[][] {
const d: number[][] = Array(1001)
.fill(0)
.map(() => Array(0));
for (const [i, x] of items) {
d[i].push(x);
}
const ans: number[][] = [];
for (let i = 1; i <= 1000; ++i) {
if (d[i].length > 0) {
d[i].sort((a, b) => b - a);
const s = d[i].slice(0, 5).reduce((a, b) => a + b);
ans.push([i, Math.floor(s / 5)]);
}
}
return ans;
}
|