Escreva um título de catálogo personalizado aqui
A ideia é comparar o tamanho do alvo e o valor central da matriz. Se o alvo for grande, a matriz 1/4 no canto superior esquerdo do centro será excluída e, se o alvo for pequeno, a matriz 1/4 no canto inferior direito será excluída. Em seguida, divida a matriz 3/4 restante em três partes, chame recursivamente a função para encontrar as três matrizes.
código mostrado abaixo:
import numpy as np
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
print(array)
array = np.array(array)
if array.size == 0:
return False
col_r = array.shape[0]
row_r = array.shape[1]
col_m = int((col_r-1)/2)
row_m = int((row_r-1)/2)
anchor = array[col_m, row_m]
if target < anchor:
return self.Find(target, array[:col_m,:row_m]) or\
self.Find(target, array[col_m:col_r,:row_m]) or\
self.Find(target, array[:col_m,row_m:row_r])
elif target > anchor:
return self.Find(target, array[col_m+1:col_r,row_m+1:row_r]) or\
self.Find(target, array[col_m+1:col_r,:row_m+1]) or\
self.Find(target, array[:col_m+1,row_m+1:row_r])
else:
return True
No entanto, a velocidade do teste é muito baixa, porque é a complexidade do log (4/3, m n). Quando a matriz é maior que 4, a velocidade será mais lenta do que O (m + n). Portanto, use a pesquisa binária para pesquisar a partir do canto superior direito, o código é o seguinte:
class Solution(object):
def findNumberIn2DArray(self, matrix, target):
if len(matrix) == 0:
return False
r = len(matrix[0])-1
t = 0
max_c = len(matrix)
while r >= 0 and t < max_c:
anchor = matrix[t][r]
if target == anchor:
return True
elif target > anchor:
t+=1
else:
r-=1
return False
Essa questão ainda é relativamente simples, ou seja, o código não é habilidoso o suficiente, preste atenção ao julgamento da matriz de entrada vazia