https://leetcode.com/problems/degree-of-an-array | Easy |
---|
Дан непустой массив неотрицательных целых чисел nums
. Степень массива определяется как максимальная частота любого из его элементов.
Ваша задача – найти минимально возможную длину (непрерывного) подмассива nums
, который имеет ту же степень, что и массив nums
.
Input:
nums = [1, 2, 2, 3, 1]Output:
2Explanation:
Степень массива равна 2 (элементы 1 и 2). Короткий подмассив: [2,2].
Input:
nums = [1, 2, 2, 3, 1, 4, 2]Output:
6Explanation:
Степень массива равна 3 (элемент 2). Короткий подмассив: [2,2,3,1,4,2].
fun findShortestSubarray(nums: IntArray): Int {
val left = mutableMapOf<Int, Int>() // Хранит первую позицию элемента
val right = mutableMapOf<Int, Int>() // Хранит последнюю позицию элемента
val count = mutableMapOf<Int, Int>() // Хранит частоту элементов
for (i in nums.indices) {
val num = nums[i]
if (num !in left) left[num] = i // Первая встреча элемента
right[num] = i // Последняя встреча элемента
count[num] = count.getOrDefault(num, 0) + 1 // Увеличиваем частоту
}
val degree = count.values.maxOrNull() ?: 0 // Находим степень массива
var minLength = Int.MAX_VALUE
for ((num, freq) in count) {
if (freq == degree) {
val length = right[num]!! - left[num]!! + 1 // Длина подмассива
minLength = minOf(minLength, length)
}
}
return minLength
}
O(n), где n — количество элементов в массиве.
O(n), так как используются дополнительные структуры для хранения позиций и частот.