住所 https://www.acwing.com/solution/LeetCode/content/5765/
タイトル説明
「電源ボタン杯」プログラミングコンテストの新ラウンドを動的に出場者のスコアデータを表示するためには、開始しようとしている、あなたはリーダーボードリーダーボードを設計する必要があります。
それは、次の3つの機能を持つように、リーダークラスを設計するために助けてください。
addScore(playerId、スコア):
すでにリストに参加した場合、スコアランキングスコアとアップデートで彼の現在の得点の増加を与えました。
参加者がランキングにない場合は、リストに追加する彼を取って、スコアが得点します。
トップ(K):第Kの参加者の合計スコアを返します。
(playerId)リセット:出場者はゼロを獲得します指定します。この関数を呼び出す前に、タイトルの保証、出場者は、成果、およびリストにされています。
初期状態では、リーダーボードが空であることに注意してください
输入: [ " リーダー"、" addScore "、" addScore "、" addScore "、" addScore "、" addScore "、" 上部"、" リセット"、" リセット"、" addScore "、" 上部" ] [[ 、[ 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.addScore(1、73); // リーダー= [1,73]。 leaderboard.addScore(2、56)。 // リーダー= [1,73]、[2,56]。 leaderboard.addScore(3、39)。 // リーダー= [1,73]、[2,56]、[3,39]。 leaderboard.addScore(4、51)。 // リーダー= [1,73]、[2,56]、[3,39]、[4,51]。 leaderboard.addScore(5、4)。 // リーダー= [1,73]、[2,56]、[3,39]、[4,51]、[5,4]。 leaderboard.top(1)。 // 73を返します。 leaderboard.reset(1)。 // リーダー= [2,56]、[3,39]、[4,51]、[5,4]。 leaderboard.reset(2)。 // リーダー= [3,39]、[4,51]、[5,4]。 leaderboard.addScore(2、51)。 // リーダー= [2,51]、[3,39]、[4,51]、[5,4]。 leaderboard.top(3)。 // 141 = 51 + 51 + 39返します。
アルゴリズム1
、私はより多くのシステム設計上の問題のように感じるこの質問
により迅速に対応するスコアとスコアを見つけるために、IDに依存する必要性にもにすばやくソート必要があるので、私たちはさまざまなニーズに応える、二つの容器に格納する必要があるべきだと思います。
スコアだけではありませんので、当然のハッシュ、単語の並べ替えを見つけ、私はベクトル取る
必要にレコードを追加および削除は、2個のコンテナを操作するための時間を
C ++コード
1 クラスリーダー{ 2 公共: 3 ベクトル< INT > scoreVec。 4 地図< INT、INT > idScore。 5 リーダー(){ 6 scoreVec.clear()。 7 idScore.clear()。 8 } 9 10 空隙 addScore(INT playerId、INT スコア){ 11 であれば(idScore.count(playerIdが)!= 0 ){ 12 INT oldscore = idScore [playerId]。 13 idScore [playerId] + = スコア。 14 ベクター< 整数 > ::それ=イテレータ(oldscore、scoreVec.begin()、scoreVec.end())を見つけます。 15 *それは+ = スコア。 16 } 17 他を{ 18 idScore [playerId] = スコア。 19 scoreVec.push_back(スコア)。 20 } 21 } 22 23 int型の上部(INT K){ 24 ソート(scoreVec.begin()、scoreVec.end()、大きい< INT > ()); 25 int型の合計= 0 ; 26 のためには、(int型 i = 0 ; iはscoreVec.sizeを(<)&& iがKを<; iは++ ){ 27 和+ = scoreVec [I]。 28 } 29 リターン和。 30 } 31 32 ボイドリセット(INT playerId){ 33 のintスコア= idScore [playerId]。 34 idScore.erase(playerId)。 35 ベクター< 整数 > ::それ=イテレータ(scoreVec.begin()、scoreVec.end()、スコア)を見つけます。 36 scoreVec.erase(それ)。 37 } 38 }。