给你一个不同学生的分数列表,请按 学生的 id 顺序 返回每个学生 最高的五科 成绩的 平均分。
对于每条 items[i]
记录, items[i][0]
为学生的 id,items[i][1]
为学生的分数。平均分请采用整数除法计算。
示例:
输入:[[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 的学生平均分为 87。 id = 2 的学生平均分为 88.6。但由于整数除法的缘故,平均分会被转换为 88。
提示:
1 <= items.length <= 1000
items[i].length == 2
- 学生的 ID 在
1
到1000
之间 - 学生的分数在
1
到100
之间 - 每个学生至少有五个分数
思路:
题目需要求每个学生的五个最高分的平均数,也就是要找到五个最高分,
对于这种找固定SIZE的最大或者最小K个数,用堆。
对于本题需要找5个最高分,应该维护SIZE为5的最小堆。
对于每一个分,先让它入堆,然后如果堆SIZE超过5就把堆顶POP出来,
因为是最小堆,所以堆顶元素最小。
这样可以保证堆中的五个元素始终是最大的。
用hashmap建立student和他的堆的映射,key是student, value是堆。
import heapq
class Solution(object):
def highFive(self, items):
"""
:type items: List[List[int]]
:rtype: List[List[int]]
"""
record = dict()
for item in items:
sd, sc = item[0], item[1] #student, score
if sd not in record:
record[sd] = [sc]
heapq.heapify(record[sd]) #初始化
else:
heapq.heappush(record[sd], sc) #新分入堆
if len(record[sd]) > 5:
heapq.heappop(record[sd]) #六个分里最小的出堆
#print record[sd]
res = []
for key, val in record.items():
res.append([key, sum(val) // 5])
# print record
return res