地址 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);
}
};

最新文章

  1. The import java.io cannot be resolved
  2. Shell脚本_判断根分区使用率
  3. MVC5-11 浅谈拦截器
  4. Spring AOP(注解方式)
  5. 【原】训练自己haar-like特征分类器并识别物体(2)
  6. 备份数据表为insert 脚本
  7. shell:监控进程运行状态并自动重启进程
  8. window7如何配置修改环境变量
  9. JavaSSM框架报HTTP Status 500 - Servlet.init() for servlet springMvc threw exception错误
  10. Redis 自定义 RedisAppender 插件, 实现日志缓冲队列,集中日志输出.
  11. python pandas ---Series,DataFrame 创建方法,操作运算操作(赋值,sort,get,del,pop,insert,+,-,*,/)
  12. 百度搜索_如何打开Intellij IDEA的代码提示功能?
  13. python生成器(转)
  14. jquery读取本地文件,Windows上报错。XMLHttpRequest cannot load xxx. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.k.cors.a.c
  15. Java 容器 LinkedHashMap源码分析2
  16. 【20181027T2】易水决【贪心+堆】
  17. BZOJ2668 [cqoi2012]交换棋子 【费用流】
  18. Android控件——ToggleButton多状态按钮(实现灯泡的开关)
  19. spring项目报org.apache.tiles.definition.DefinitionsFactoryException: I/O错误原因及解决办法。
  20. sql server数据类型char和nchar,varchar和nvarchar,text和ntext

热门文章

  1. vmware无法安装vmware authorization&amp;windows无法启动VMware Authorization Service服务
  2. [转]自定义UiPath Activity实践
  3. Kotlin exception
  4. XTTS Creates Alias on Destination when Source and Destination use ASM (Doc ID 2351123.1)
  5. 【cf961G】G. Partitions(组合意义+第二类斯特林数)
  6. vuex——action,mutation,getters的调用
  7. [考试反思]1111csp-s模拟测试110:三思
  8. 解决RubyMine中puts中文显示乱码的问题
  9. [译]ASP.NET:WebForms vs MVC
  10. 【朝花夕拾】Android自定义View篇之(四)自定义View的三种实现方式及自定义属性使用介绍