
Постановка задачи
Учитывая n x n matrix, где каждая из строк и столбцов отсортирована в порядке возрастания, возвращает самый маленький элемент kth наименьшего элемента в матрице.
Обратите внимание, что это kth наименьший элемент в порядке сортировки, а не kth отдельный элемент.
Вы должны найти решение со сложностью памяти лучше, чем O(n^2).
Тестовые случаи
Пример 1:
Input: matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8 Output: 13 Explanation: The elements in the matrix are [1,5,9,10,11,12,13,13,15], and the 8th smallest number is 13
Пример 2:
Input: matrix = [[-5]], k = 1 Output: -5
Ограничения
n == matrix.length == matrix[i].length1 <= n <= 300-10^9 <= matrix[i][j] <= 10^9- Все строки и столбцы
matrixгарантировано отсортированы в неубывающем порядке. 1 <= k <= n^2
Подход
Это еще один вариант поиска k-го наибольшего/наименьшего числа из заданного ввода. Небольшое изменение состоит в том, что вход представляет собой матрицу. В любом случае, мы все еще можем продолжить наш общий подход к поиску k-го наибольшего/наименьшего числа с использованием priorityqueue/heap.
Поскольку это поиск k-го наименьшего элемента в матрице, мы будем использовать maxHeap, и если вопрос касался k-го самого большого элемента в матрице, то это будет minHeap.
Алгоритм
- Создайте maxHeap.
- Пройдитесь по матрице и продолжайте добавлять элементы в maxHeap.
- Если размер maxHeap становится больше, чем k, просто опросите самый верхний элемент и продолжите обход.
- Наконец, верните любой элемент, присутствующий в верхней части кучи.
Сложность времени и пространства
Мы используем приоритетную очередь, которая сортирует добавляемый элемент в кучу + мы также проходим через матрицу. Таким образом, временная сложность будет O(n*nlog(n*n)) + O(n² * log(n²)) так как logn времени потребуется для добавления элемента в кучу.
Внутри maxheap будет храниться максимум K элементов, поэтому сложность нашего пространства будет O(K).
Код
