Algoritmo leetcode | 74. Búsqueda de matriz bidimensional (el óxido golpea con fuerza)



74. Busque una matriz bidimensional:

Dada una m x nmatriz 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á targeten 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 ~


Supongo que te gusta

Origin blog.csdn.net/leyi520/article/details/132533415
Recomendado
Clasificación