506. Relative Ranks

Problem


Tags: Array, Sorting, Heap (Priority Queue)

You are given an integer array score of size n, where score[i] is the score of the i^th athlete in a competition. All the scores are guaranteed to be unique.

The athletes are placed based on their scores, where the 1^st place athlete has the highest score, the 2^nd place athlete has the 2^nd highest score, and so on. The placement of each athlete determines their rank:

  • The 1^st place athlete's rank is "Gold Medal".
  • The 2^nd place athlete's rank is "Silver Medal".
  • The 3^rd place athlete's rank is "Bronze Medal".
  • For the 4^th place to the n^th place athlete, their rank is their placement number (i.e., the x^th place athlete's rank is "x").

Return an array answer of size n where answer[i] is the rank of the i^th athlete.

Example 1:

Input: score = [5,4,3,2,1]
Output: ["Gold Medal","Silver Medal","Bronze Medal","4","5"]
Explanation: The placements are [1st, 2nd, 3rd, 4th, 5th].

Example 2:

Input: score = [10,3,8,9,4]
Output: ["Gold Medal","5","Bronze Medal","Silver Medal","4"]
Explanation: The placements are [1st, 5th, 3rd, 2nd, 4th].

Constraints:

  • n == score.length
  • 1 <= n <= 10^4
  • 0 <= score[i] <= 10^6
  • All the values in score are unique.

Code

JS

// 506. Relative Ranks (10/26/53712)
// Runtime: 76 ms (93.07%) Memory: 42.64 MB (94.89%) 

/**
 * @param {number[]} score
 * @return {string[]}
 */

const ranks = ["Gold Medal", "Silver Medal", "Bronze Medal"];

function findRelativeRanks(score) {
    const pairs = [];
    for (let i = 0; i < score.length; i++) pairs.push([i, score[i]]);
    pairs.sort((a, b) => b[1] - a[1]);

    const result = [];
    pairs.forEach((pair, i) => {
        result[pair[0]] = i < 3 ? ranks[i] : (i + 1).toString();
    });

    return result;
}