LeetCode 1244. 力扣排行榜
地址 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. 力扣排行榜的更多相关文章
- LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组 中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...
- LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...
- 上班如何优雅的使用idea刷LeetCode(力扣)
打开idea file->setting ->plugins 搜索 "LeetCode" install "LeetCode editor" 重启后 ...
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
- 力扣Leetcode 179. 最大数 EOJ 和你在一起 字符串拼接 组成最大数
最大数 力扣 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说 ...
- 力扣Leetcode 45. 跳跃游戏 II - 贪心思想
这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...
- 【力扣leetcode】-787. K站中转内最便宜的航班
题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...
- 力扣Leetcode 面试题56 - I. 数组中数字出现的次数
面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...
- 力扣算法——135Candy【H】
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中,评分高 ...
随机推荐
- Flask 教程 第十二章:日期和时间
本文翻译自The Flask Mega-Tutorial Part XII: Dates and Times 这是Flask Mega-Tutorial系列的第十二部分,我将告诉你如何以适配所有用户的 ...
- 如何修改PhpStorm快捷键
- python 装饰器使用总结
python 装饰器使用总结 by:授客 QQ:1033553122 测试环境 win10 python 3.5 例1:一个简单的例子 #!/usr/bin/env python # -*- codi ...
- angular cli + primeNG
目录: 1.安装 angular cli 2.创建项目 3.构建路由 4.新建组件 5.组件之间的通信 6.引入primeNG 7.修改primeNG组件样式 8.问题 -------------- ...
- 从0系统学Android--3.5 最常用和最难用的控件---ListView
从0系统学Android-- 3.5 最常用和最难用的控件---ListView 本系列文章目录:更多精品文章分类 本系列持续更新中.... 3.5 最常用和最难用的控件---ListView Lis ...
- gitlab忘记密码如何重置
gitlab web登入密码忘记以后可以用如下方式修改密码shell>cd /home/git/gitlabshell> su gitshell>bundle exec rails ...
- log file switch (checkpoint incomplete) - 容易被误诊的event
本文转自 https://blogs.oracle.com/database4cn/log-file-switch-checkpoint-incomplete-%e5%ae%b9%e6%98%93%e ...
- qt 自定义控件窗口提升
- Django信号机制相关解释与示例
Django 信号# django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发 ...
- 【学习笔记】C/C++
1. C语言中的 scanf() 函数 该函数包含在头文件 <stdio.h> 或者 <cstdio> (在C++中使用时) 函数的返回值指的是 所输入的数据与格式字符串匹配的 ...