Design a Leaderboard class, which has 3 functions:
addScore(playerId, score)
: Update the leaderboard by addingscore
to the given player's score. If there is no player with such id in the leaderboard, add him to the leaderboard with the givenscore
.top(K)
: Return the score sum of the topK
players.reset(playerId)
: Reset the score of the player with the given id to 0 (in other words erase it from the leaderboard). It is guaranteed that the player was added to the leaderboard before calling this function.
Initially, the leaderboard is empty.
Example 1:
Input: ["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]] Output: [null,null,null,null,null,null,73,null,null,null,141] Explanation: 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;
Constraints:
1 <= playerId, K <= 10000
- It's guaranteed that
K
is less than or equal to the current number of players. 1 <= score <= 100
- There will be at most
1000
function calls.
Companies:
Bloomberg, Google, Facebook, Twitter
Related Topics:
Hash Table, Design, Sorting
// OJ: https://leetcode.com/problems/design-a-leaderboard/
// Author: github.com/lzl124631x
// Time:
// Leaderboard: O(1)
// addScore: O(1)
// top: O(NlogK)
// reset: O(1)
// Space: O(N + K)
class Leaderboard {
unordered_map<int, int> m;
public:
Leaderboard() {}
void addScore(int playerId, int score) {
m[playerId] += score;
}
int top(int K) {
priority_queue<int, vector<int>, greater<>> pq;
for (auto &[id, score] : m) {
pq.push(score);
if (pq.size() > K) pq.pop();
}
int ans = 0;
while (pq.size()) {
ans += pq.top();
pq.pop();
}
return ans;
}
void reset(int playerId) {
m[playerId] = 0;
}
};