地址 https://www.acwing.com/solution/LeetCode/content/5765/

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

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

addScore(playerId, score):
假如参赛者已经在排行榜上,就给他的当前得分增加 score 点分值并更新排行。
假如该参赛者不在排行榜上,就把他添加到榜单上,并且将分数设置为 score。
top(K):返回前 K 名参赛者的 得分总和。
reset(playerId):将指定参赛者的成绩清零。题目保证在调用此函数前,该参赛者已有成绩,并且在榜单上。
请注意,在初始状态下,排行榜是空的

输入:
["Leaderboard","addScore","addScore","addScore","addScore","addScore","top","reset","reset","addScore","top"]
[[],[,],[,],[,],[,],[,],[],[],[],[,],[]]
输出:
[null,null,null,null,null,null,,null,null,null,] 解释:
Leaderboard leaderboard = new Leaderboard ();
leaderboard.addScore(,); // leaderboard = [[1,73]];
leaderboard.addScore(,); // leaderboard = [[1,73],[2,56]];
leaderboard.addScore(,); // leaderboard = [[1,73],[2,56],[3,39]];
leaderboard.addScore(,); // leaderboard = [[1,73],[2,56],[3,39],[4,51]];
leaderboard.addScore(,); // leaderboard = [[1,73],[2,56],[3,39],[4,51],[5,4]];
leaderboard.top(); // returns 73;
leaderboard.reset(); // leaderboard = [[2,56],[3,39],[4,51],[5,4]];
leaderboard.reset(); // leaderboard = [[3,39],[4,51],[5,4]];
leaderboard.addScore(,); // leaderboard = [[2,51],[3,39],[4,51],[5,4]];
leaderboard.top(); // returns 141 = 51 + 51 + 39;

算法1
这道题目 我感觉更像系统设计题
由于需要依靠ID快速查找对应分数 并且分数还需要快速排序,所以我觉得应该 需要两个容器去进行存储,应对不同的需求。
查找当然是哈希,排序的话由于分数不是唯一的,我采取的是vector
那么对记录进行增删改的时候 就需要对两个容器进行操作

C++ 代码

 class Leaderboard {
public:
vector<int> scoreVec;
map<int, int> idScore;
Leaderboard() {
scoreVec.clear();
idScore.clear();
} void addScore(int playerId, int score) {
if (idScore.count(playerId) != ) {
int oldscore = idScore[playerId];
idScore[playerId] += score;
vector<int>::iterator it = find(scoreVec.begin(), scoreVec.end(), oldscore);
*it += score;
}
else {
idScore[playerId] = score;
scoreVec.push_back(score);
}
} int top(int K) {
sort(scoreVec.begin(), scoreVec.end(),greater<int>());
int sum = ;
for (int i = ; i < scoreVec.size() && i < K; i++) {
sum += scoreVec[i];
}
return sum;
} void reset(int playerId) {
int score = idScore[playerId];
idScore.erase(playerId);
vector<int>::iterator it = find(scoreVec.begin(), scoreVec.end(), score);
scoreVec.erase(it);
}
};

LeetCode 1244. 力扣排行榜的更多相关文章

  1. LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组   中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...

  2. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  3. 上班如何优雅的使用idea刷LeetCode(力扣)

    打开idea file->setting ->plugins 搜索 "LeetCode" install "LeetCode editor" 重启后 ...

  4. 力扣(LeetCode)删除排序链表中的重复元素II 个人题解

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...

  5. 力扣Leetcode 179. 最大数 EOJ 和你在一起 字符串拼接 组成最大数

    最大数 力扣 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说 ...

  6. 力扣Leetcode 45. 跳跃游戏 II - 贪心思想

    这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...

  7. 【力扣leetcode】-787. K站中转内最便宜的航班

    题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...

  8. 力扣Leetcode 面试题56 - I. 数组中数字出现的次数

    面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...

  9. 力扣算法——135Candy【H】

    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中,评分高 ...

随机推荐

  1. Flask 教程 第十二章:日期和时间

    本文翻译自The Flask Mega-Tutorial Part XII: Dates and Times 这是Flask Mega-Tutorial系列的第十二部分,我将告诉你如何以适配所有用户的 ...

  2. 如何修改PhpStorm快捷键

  3. python 装饰器使用总结

    python 装饰器使用总结 by:授客 QQ:1033553122 测试环境 win10 python 3.5 例1:一个简单的例子 #!/usr/bin/env python # -*- codi ...

  4. angular cli + primeNG

    目录: 1.安装  angular cli 2.创建项目 3.构建路由 4.新建组件 5.组件之间的通信 6.引入primeNG 7.修改primeNG组件样式 8.问题 -------------- ...

  5. 从0系统学Android--3.5 最常用和最难用的控件---ListView

    从0系统学Android-- 3.5 最常用和最难用的控件---ListView 本系列文章目录:更多精品文章分类 本系列持续更新中.... 3.5 最常用和最难用的控件---ListView Lis ...

  6. gitlab忘记密码如何重置

    gitlab web登入密码忘记以后可以用如下方式修改密码shell>cd /home/git/gitlabshell> su gitshell>bundle exec rails ...

  7. log file switch (checkpoint incomplete) - 容易被误诊的event

    本文转自 https://blogs.oracle.com/database4cn/log-file-switch-checkpoint-incomplete-%e5%ae%b9%e6%98%93%e ...

  8. qt 自定义控件窗口提升

  9. Django信号机制相关解释与示例

    Django 信号# django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发 ...

  10. 【学习笔记】C/C++

    1. C语言中的 scanf() 函数 该函数包含在头文件 <stdio.h> 或者 <cstdio> (在C++中使用时) 函数的返回值指的是 所输入的数据与格式字符串匹配的 ...