文章目录
- 1. 题目
- 2. 解题
1. 题目
新一轮的「力扣杯」编程大赛即将启动,为了动态显示参赛者的得分数据,需要设计一个排行榜 Leaderboard。
请你帮忙来设计这个 Leaderboard 类,使得它有如下 3 个函数:
addScore(playerId, score)
:
假如参赛者已经在排行榜上,就给他的当前得分增加 score 点分值并更新排行。
假如该参赛者不在排行榜上,就把他添加到榜单上,并且将分数设置为 score。top(K)
:返回前 K 名参赛者的 得分总和。reset(playerId)
:将指定参赛者的成绩清零。题目保证在调用此函数前,该参赛者已有成绩,并且在榜单上。
请注意,在初始状态下,排行榜是空的。
示例 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. 解题
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
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!