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