前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1244. 力扣排行榜(map+multiset)

LeetCode 1244. 力扣排行榜(map+multiset)

作者头像
Michael阿明
发布2020-07-13 14:40:33
5880
发布2020-07-13 14:40:33
举报

1. 题目

新一轮的「力扣杯」编程大赛即将启动,为了动态显示参赛者的得分数据,需要设计一个排行榜 Leaderboard。

请你帮忙来设计这个 Leaderboard 类,使得它有如下 3 个函数:

  • addScore(playerId, score): 假如参赛者已经在排行榜上,就给他的当前得分增加 score 点分值并更新排行。 假如该参赛者不在排行榜上,就把他添加到榜单上,并且将分数设置为 score。
  • top(K):返回前 K 名参赛者的 得分总和。
  • reset(playerId):将指定参赛者的成绩清零。题目保证在调用此函数前,该参赛者已有成绩,并且在榜单上。 请注意,在初始状态下,排行榜是空的。
代码语言:javascript
复制
示例 1:
输入: 
["Leaderboard","addScore","addScore","addScore","addScore","addScore","top","reset","reset","addScore","top"]
[[],[1,73],[2,56],[3,39],[4,51],[5,4],[1],[1],[2],[2,51],[3]]
输出:
[null,null,null,null,null,null,73,null,null,null,141]
解释: 
Leaderboard leaderboard = new Leaderboard ();
leaderboard.addScore(1,73);   // leaderboard = [[1,73]];
leaderboard.addScore(2,56);   // leaderboard = [[1,73],[2,56]];
leaderboard.addScore(3,39);   // leaderboard = [[1,73],[2,56],[3,39]];
leaderboard.addScore(4,51);   // leaderboard = [[1,73],[2,56],[3,39],[4,51]];
leaderboard.addScore(5,4);    // leaderboard = [[1,73],[2,56],[3,39],[4,51],[5,4]];
leaderboard.top(1);           // returns 73;
leaderboard.reset(1);         // leaderboard = [[2,56],[3,39],[4,51],[5,4]];
leaderboard.reset(2);         // leaderboard = [[3,39],[4,51],[5,4]];
leaderboard.addScore(2,51);   // leaderboard = [[2,51],[3,39],[4,51],[5,4]];
leaderboard.top(3);           // returns 141 = 51 + 51 + 39;
 
提示:
1 <= playerId, K <= 10000
题目保证 K 小于或等于当前参赛者的数量
1 <= score <= 100
最多进行 1000 次函数调用

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/design-a-leaderboard 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

代码语言:javascript
复制
struct cmp
{
	bool operator()(int a, int b) const
	{
		return a > b;
	}
};
class Leaderboard {
	unordered_map<int,int> m;//id,score
	multiset<int, cmp> topk;//分数,降序排列
public:
    Leaderboard() {

    }
    
    void addScore(int playerId, int score) {
    	if(m.find(playerId) == m.end())
    	{
    		m[playerId] = score;
            topk.insert(score);
    	}
    	else
    	{
            auto it = topk.find(m[playerId]);
            topk.erase(it);//删除分数
            m[playerId] += score;
            topk.insert(m[playerId]);//更新分数
        }
    }
    
    int top(int K) {
    	int sum = 0;
    	for(auto it = topk.begin(); it != topk.end() && K; ++it)
    	{
            K--;
    		sum += (*it);
    	}
    	return sum;
    }
    
    void reset(int playerId) {
        auto it = topk.find(m[playerId]);
        topk.erase(it);
    	m[playerId] = 0;
        topk.insert(0);
    }
};

28 ms 11.2 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档