【Likou】74. Buscar matriz bidimensional
Dada una matriz mxn de enteros que satisfacen las siguientes dos propiedades:
- Los números enteros en cada fila están en orden no decreciente de izquierda a derecha.
- El primer entero de cada fila es mayor que el último entero de la fila anterior.
Dado un objetivo entero, si el objetivo está en la matriz, devuelve verdadero; de lo contrario, devuelve falso.
Ejemplo 1:
1 | 3 | 5 | 7 |
---|---|---|---|
10 | 11 | dieciséis | 20 |
23 | 30 | 34 | 60 |
Entrada: matriz = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], objetivo = 3
Salida: verdadero
Ejemplo 2:
1 | 3 | 5 | 7 |
---|---|---|---|
10 | 11 | dieciséis | 20 |
23 | 30 | 34 | 60 |
Entrada: matriz = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], objetivo = 13
Salida: falso
提示:
m == matriz.longitud
n == matriz[i].longitud
1 <= m, n <= 100
- 1 0 4 10^41 04 <= matriz[i][j], destino <=1 0 4 10^41 04
respuesta
Mejora de la dicotomía, asignando una matriz bidimensional a una matriz unidimensional para la dicotomía
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) {
return false;
}
int row = matrix.length;
int col = matrix[0].length;
int left = 0;
int right = row * col - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
// (x,y) --> x*col+y
//反过来:一维转二维:matrix[mid/col][mid%col]
int element = matrix[mid / col][mid % col];
if (element == target) {
return true;
}
else if (element > target) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return false;
}
}