LeetCodeEasy- [Entrevista Questão 04. Localizando em uma matriz bidimensional]

Em uma matriz bidimensional n * m, cada linha é classificada em ordem crescente da esquerda para a direita e cada coluna é classificada em ordem crescente de cima para baixo. Por favor, complete uma função, insira uma matriz bidimensional e um número inteiro e determine se a matriz contém o número inteiro.

Exemplo:

A matriz existente é a seguinte:

[
  [1, 4, 7, 11, 15],
  [2, 5, 8, 12, 19],
  [3, 6, 9, 16, 22],
  [10, 13, 14, 17, 24],
  [ 18, 21, 23, 26, 30]
]
Dado o alvo = 5, retorne verdadeiro.

Dado alvo = 20, retorne falso.

Restrições:

0 <= n <= 1000

0 <= m <= 1000

Fonte: LeetCode
Link: https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof Os
direitos autorais pertencem à rede de deduções. Entre em contato com a autorização oficial para reimpressão comercial e indique a fonte da reimpressão não comercial.

Ideia 1: Violência

 A pesquisa direta de força bruta circular de duas camadas é suficiente e é classificada para fazer algumas otimizações ao atravessar.

Complexidade temporal: O (n * m)

Complexidade do espaço: O (1)

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        if matrix == [] or matrix == [[]]:
            return False
        # 暴力
        max_j = len(matrix[0])
        i = 0
        j = 0
        while i < len(matrix) and matrix[i][0] <= target:
            j = 0
            while j < max_j:
                if matrix[i][j] == target:
                    return True
                if matrix[i][j] > target:
                    max_j = j 
                j += 1
            i += 1
        return False

Ideia 2: pesquisa linear - canto superior direito (ou canto inferior esquerdo)

       As informações de classificação da matriz original usada na Ideia 1 não são suficientes; você pode considerar iniciar a pesquisa no canto superior direito. Se o valor-alvo for menor que ele, o valor por trás da coluna será maior e será desnecessário considerá-lo, exclua diretamente a coluna; se o valor-alvo for maior que ele, obviamente a mesma linha será menor que ele, será necessário pular para A próxima linha exclui essa linha; se forem iguais, a pesquisa termina diretamente.

        Da mesma forma, se você começar a pesquisar no canto inferior esquerdo, a ideia da operação será a mesma que no canto superior direito.

Complexidade temporal: O (n + m)

Complexidade do espaço: O (1)

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        if matrix == [] or matrix == [[]]:
            return False
        # 线性查找: 右上角
        i = 0
        j = len(matrix[0]) - 1
        while i < len(matrix) and j >= 0:
            if target == matrix[i][j]:
                return True
            elif target > matrix[i][j]:
                i += 1
            else:
                j -= 1
        return False

 

Publicado 314 artigos originais · 22 elogios · mais de 20.000 visualizações

Acho que você gosta

Origin blog.csdn.net/qq_39451578/article/details/105321908
Recomendado
Clasificación