LeetCode-Python-1086. 前五科的均分

660 篇文章 23 订阅

给你一个不同学生的分数列表,请按 学生的 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. 1 <= items.length <= 1000
  2. items[i].length == 2
  3. 学生的 ID 在 1 到 1000 之间
  4. 学生的分数在 1 到 100 之间
  5. 每个学生至少有五个分数

思路:

题目需要求每个学生的五个最高分的平均数,也就是要找到五个最高分,

对于这种找固定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
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值