Description

Given an array of integers arr, replace each element with its rank.

The rank represents how large the element is. The rank has the following rules:

  • Rank is an integer starting from 1.
  • The larger the element, the larger the rank. If two elements are equal, their rank must be the same.
  • Rank should be as small as possible.

Example 1:

  • Input: arr = [40,10,20,30]
  • Output: [4,1,2,3]
  • Explanation: 40 is the largest element. 10 is the smallest. 20 is the second smallest. 30 is the third smallest.

Example 2:

  • Input: arr = [100,100,100]
  • Output: [1,1,1]
  • Explanation: Same elements share the same rank.

Example 3:

  • Input: arr = [37,12,28,9,100,56,80,5,12]
  • Output: [5,3,4,2,8,6,7,1,3]

Constraints:

  • 0 <= arr.length <= 105
  • -109 <= arr[i] <= 109

💡 Hint 1:
Use a temporary array to copy the array and sort it.

💡 Hint 2:
The rank of each element is the number of unique elements smaller than it in the sorted array plus one.

Submitted Code

class Solution:
    def arrayRankTransform(self, arr: List[int]) -> List[int]:
        table = {}
        temp = sorted(set(arr))

        for i, num in enumerate(temp):
            table[num] = i + 1

        return [table[num] for num in arr]

Runtime: 31 ms | Beats 92.38%
Memory: 37.79 MB | Beats 37.75%

set()으로 중복된 원소를 없앤 후 sorted()로 정렬된 리스트를 만들었다. 임시 리스트에서 각 원소의 index + 1이 rank가 된다.

Other Solutions

1st

class Solution:
    def arrayRankTransform(self, A):
        rank = {}
        for a in sorted(A):
            rank.setdefault(a, len(rank) + 1)
        return list(map(rank.get, A))   # [rank[x] for x in A]

time complexity: 𝑂(𝑛log𝑛)
space complexity: 𝑂(𝑛)

딕셔너리의 setdefault(key, value)는 키가 없을 때만 값을 저장할 수 있다. 값(rank)은 현재까지 저장된 키 개수 + 1이다.

Leave a comment