https://leetcode.com/problems/rank-transform-of-an-array/description/ Easy

Условие

Дан массив целых чисел arr. Преобразуй его в массив рангов таким образом:

• Уникальные значения получают ранг от 1 и выше в порядке возрастания.

• Элементы с одинаковым значением получают одинаковый ранг.

• Чем меньше значение, тем меньше ранг. Верни массив рангов той же длины.

Примеры

Input: arr = [40, 10, 20, 30] Output: [4, 1, 2, 3] Explanation: Упорядоченные значения: [10, 20, 30, 40] → ранги: 1, 2, 3, 4

Input: arr = [100, 100, 100] Output: [1, 1, 1] Explanation: Все элементы одинаковые → один ранг

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

Решение

fun arrayRankTransform(arr: IntArray): IntArray {
    // Создаем копию массива и сортируем её, удаляя дубликаты
    val sortedUnique = arr.distinct().sorted()
    
    // Создаем карту, где каждому числу соответствует его ранг
    val rankMap = mutableMapOf<Int, Int>()
    for (i in sortedUnique.indices) {
        rankMap[sortedUnique[i]] = i + 1
    }
    
    // Преобразуем исходный массив, заменяя элементы на их ранги
    val result = IntArray(arr.size)
    for (i in arr.indices) {
        result[i] = rankMap[arr[i]]!!
    }
    
    return result
}

Временная сложность

O(n^2) — из-за ручной сортировки массива вложенными циклами.

Пространственная сложность

O(n) — используется дополнительная память для хранения отображения значений и копии массива.