Я имею в виду вопрос leetcode: Kth Наименьший Элемент в отсортированной матрице
Есть два известных решения проблемы. Один использует Heap/PriorityQueue, а другой использует двоичный поиск. Решение для двоичного поиска выглядит следующим образом (верхнее сообщение):
public class Solution {
public int kthSmallest(int[][] matrix, int k) {
int lo = matrix[0][0], hi = matrix[matrix.length - 1][matrix[0].length - 1] + 1;//[lo, hi)
while(lo < hi) {
int mid = lo + (hi - lo) / 2;
int count = 0, j = matrix[0].length - 1;
for(int i = 0; i < matrix.length; i++) {
while(j >= 0 && matrix[i][j] > mid) j--;
count += (j + 1);
}
if(count < k) lo = mid + 1;
else hi = mid;
}
return lo;
}
}
Хотя я понимаю, как это работает, мне трудно понять одну проблему. Как мы можем быть уверены, что возвращаемый lo
всегда находится в матрице?
Поскольку область поиска представляет собой min
и max
значения массива, mid
НЕ обязательно должно быть значением, которое находится в массиве. Однако возвращаемый lo
всегда есть.
Почему это происходит?