Directorio de artículos
74. Busque una matriz bidimensional:
Dada una m x n
matriz de números enteros que satisfacen las dos propiedades siguientes:
- Los números enteros de cada fila están en orden no decreciente de izquierda a derecha.
- El primer número entero de cada fila es mayor que el último número entero de la fila anterior.
Dado un número entero target
, si está target
en la matriz, lo devuelve true
; en caso contrario, lo devuelve false
.
Ejemplo 1:
输入:
matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:
true
Ejemplo 2:
输入:
matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:
false
pista:
- m == matriz.longitud
- n == matriz[i].longitud
- 1 <= m, n <= 100
- -10 4 <= matriz[i][j], objetivo <= 10 4
analizar:
- Ante este problema de algoritmo, el segundo líder volvió a pensar profundamente.
- En una lista ordenada, para encontrar un elemento específico, generalmente se utiliza la búsqueda binaria, que es muy eficiente.
- Pero el título es una matriz bidimensional, ¿podemos seguir utilizando la búsqueda binaria?
- En primer lugar, creo que podemos usar dos búsquedas binarias para ver en qué fila y columna se encuentra. La eficiencia ya es muy alta, pero ¿podemos usar solo una búsqueda binaria?
- Si desea utilizar una búsqueda binaria, debe convertir la matriz bidimensional en una estructura lineal, ¿hay alguna forma?
- Podemos calcular rápidamente la longitud y el ancho de la matriz, y también podemos obtener su longitud total. Podemos convertir rápidamente los subíndices dentro del rango de longitud en subíndices de filas y columnas, porque las filas y columnas tienen la misma longitud.
respuesta:
óxido:
impl Solution {
pub fn search_matrix(matrix: Vec<Vec<i32>>, target: i32) -> bool {
let (m, n) = (matrix.len(), matrix[0].len());
let (mut left, mut right) = (0, m * n);
while left < right {
let mid = left + ((right - left) >> 1);
let v = matrix[mid / n][mid % n];
if v < target {
left = mid + 1;
} else if v > target {
right = mid;
} else {
return true;
}
}
return false;
}
}
ir:
func searchMatrix(matrix [][]int, target int) bool {
m, n := len(matrix), len(matrix[0])
i := sort.Search(m*n, func(i int) bool {
return matrix[i/n][i%n] >= target })
return i < m*n && matrix[i/n][i%n] == target
}
c++:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
const int m = matrix.size(), n = matrix[0].size();
int left = 0, right = m * n;
while (left < right) {
const int mid = left + ((right - left) >> 1);
const int v = matrix[mid / n][mid % n];
if (v < target) {
left = mid + 1;
} else if (v > target) {
right = mid;
} else {
return true;
}
}
return false;
}
};
pitón:
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m, n = len(matrix), len(matrix[0])
left, right = 0, m * n
while left < right:
mid = left + ((right - left) >> 1)
v = matrix[mid // n][mid % n]
if v < target:
left = mid + 1
elif v > target:
right = mid
else:
return True
return False
Java:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
final int m = matrix.length, n = matrix[0].length;
int left = 0, right = m * n;
while (left < right) {
final int mid = left + ((right - left) >> 1);
final int v = matrix[mid / n][mid % n];
if (v < target) {
left = mid + 1;
} else if (v > target) {
right = mid;
} else {
return true;
}
}
return false;
}
}
Muchas gracias por leer este artículo~
Bienvenido a 【Me gusta】【Favorito】【Comentario】Camina tres veces seguidas~ No es
difícil darse por vencido, pero debe ser genial perseverar~
Espero que todos podamos mejorar un poco todos los días ~
Este artículo está escrito por el sombrero blanco del segundo maestro: https://le-yi.blog.csdn.net/Blog original ~