Решение
class Solution {
fun findRelativeRanks(score: IntArray): Array<String> {
val n = score.size
val idx = IntArray(n) { it }
fun swap(i: Int, j: Int) { val t = idx[i]; idx[i] = idx[j]; idx[j] = t }
fun part(l: Int, r: Int): Int {
val p = score[idx[(l + r) ushr 1]]
var i = l
var j = r
while (i <= j) {
while (score[idx[i]] > p) i++
while (score[idx[j]] < p) j--
if (i <= j) { swap(i, j); i++; j-- }
}
return i
}
var a = 0
var b = n - 1
val st = IntArray(64)
var top = 0
while (true) {
if (a < b) {
val m = part(a, b)
if (m - a < b - m) {
if (m < b) { st[top++] = m; st[top++] = b }
b = m - 1
} else {
if (a < m - 1) { st[top++] = a; st[top++] = m - 1 }
a = m
}
} else {
if (top == 0) break
b = st[--top]
a = st[--top]
}
}
val res = Array(n) { "" }
var i = 0
while (i < n) {
val rank = i + 1
res[idx[i]] = when (rank) {
1 -> "Gold Medal"
2 -> "Silver Medal"
3 -> "Bronze Medal"
else -> rank.toString()
}
i++
}
return res
}
}