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)
— используется дополнительная память для хранения отображения значений и копии массива.