Постановка задачи — проверить, присутствует ли элемент в матрице размера n*m, в которой строки и столбцы отсортированы по возрастанию.

Образец ввода -

[ [1, 3, 12],

[2, 4 , 20],

[5, 10, 30]]

k=4

Вывод

истинный

Решение:

Первоначальная мысль состоит в том, чтобы применить бинарный поиск к каждой строке, и если в какой-либо из строк есть элемент, то вернуть true, иначе вернуть false.

Временная сложность решения составляет O (n log m), что лучше, чем решение грубой силы, когда вы перебираете все элементы, что приводит к O (n * m)

Это можно решить лучше, используя бинарный поиск.

Примечание. Строки и столбцы располагаются в отсортированном порядке, поэтому элемент, находящийся в левой ячейке текущего элемента, будет меньше текущего значения, а элемент, находящийся под текущим элементом, будет больше текущего значения.

давайте рассмотрим элемент 4 в приведенном выше образце ввода, элемент, присутствующий слева от 4, будет меньше (2‹4), а элемент, присутствующий под элементом 4, будет больше, чем 4 (4‹10)

поэтому, если мы начнем с верхнего правого углового элемента матрицы, мы можем сравнить целевой элемент с текущим элементом и соответственно двигаться в соответствии с сравнением.

скажем, в приведенном выше примере-

Элемент в верхнем правом углу равен 12, а целевой элемент равен 4.

если текущий элемент меньше целевого элемента, то переместитесь в ячейку под ним, потому что мы знаем, что нижний элемент будет больше, чем текущий элемент, иначе переместитесь в левую ячейку текущего элемента, поэтому в этом случае мы переместим левую ячейку элемент 12, который является элементом 3, и если мы снова сравним с целевым элементом 4, то мы переместимся ниже, поскольку текущий элемент меньше целевого, поэтому мы нашли целевой элемент 4

поскольку размер матрицы равен n * m, поэтому из правого верхнего угла мы можем переместить n ячеек ниже и m ячеек влево от верхнего левого угла.

Следовательно, временная сложность O (n + m)

КОД —

общедоступный логический brinarySearch (int grid [][], int k) {

int n = grid.length;

int m = сетка [0]. длина;

if(k ‹ сетка[0][0] || k› сетка[n-1][m-1])

вернуть ложь;

интервал i=0, j=m-1; \\ положение в правом верхнем углу

в то время как (j≥0 && i‹n){

если (сетка [i] [j] == k)

вернуть истину;

иначе если (сетка[i][j] › k)

j-- ;

еще

i++;

}

вернуть ложь;

}