Сложность: hard
У вас есть k списков отсортированных целых чисел в неубывающем порядке. Найдите наименьший диапазон, в который входит хотя бы одно число из каждого из k списков. Мы определяем, что диапазон [a, b] меньше диапазона [c, d], если b - a < d - c или a < c, если b - a == d - c.
Пример:
Input: nums = [[4,10,15,24,26],[0,9,12,20],[5,18,22,30]]
Output: [20,24]
👨💻 Алгоритм:
1⃣Инициализация и сбор всех начальных элементов
Создайте массив для хранения текущих индексов каждого списка и используйте минимальную кучу для отслеживания текущих минимальных элементов из каждого списка.
2⃣Нахождение минимального диапазона
Используйте кучу для извлечения минимального элемента и обновления текущего диапазона. Обновляйте максимальный элемент в текущем диапазоне при добавлении новых элементов.
3⃣Проверка и обновление диапазона
Продолжайте обновлять кучу и диапазон, пока возможно. Завершите, когда один из списков исчерпан.
😎 Решение:
import Foundation
struct Element: Comparable {
let value: Int
let row: Int
let col: Int
static func < (lhs: Element, rhs: Element) -> Bool {
return lhs.value < rhs.value
}
}
class Solution {
func smallestRange(_ nums: [[Int]]) -> [Int] {
var minHeap = [Element]()
var maxValue = Int.min
for i in 0..<nums.count {
let element = Element(value: nums[i][0], row: i, col: 0)
minHeap.append(element)
maxValue = max(maxValue, nums[i][0])
}
minHeap.sort()
var rangeStart = 0
var rangeEnd = Int.max
while minHeap.count == nums.count {
let minElement = minHeap.removeFirst()
if maxValue - minElement.value < rangeEnd - rangeStart {
rangeStart = minElement.value
rangeEnd = maxValue
}
if minElement.col + 1 < nums[minElement.row].count {
let newValue = nums[minElement.row][minElement.col + 1]
let newElement = Element(value: newValue, row: minElement.row, col: minElement.col + 1)
minHeap.append(newElement)
maxValue = max(maxValue, newValue)
minHeap.sort()
}
}
return [rangeStart, rangeEnd]
}
}
Ставь 👍 и забирай 📚 Базу знаний
