这里写自定义目录标题
自己想的思路是比较target与矩阵中心值的大小,如果target大,则排除中心左上的1/4矩阵, 如果target小,则排除右下的1/4矩阵。 然后把剩下的3/4矩阵分割三份,recursively 调用函数查找三个矩阵。
代码如下:
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
不过测试速度很低,因为是log(4/3, mn)的复杂度,矩阵大于44时速度就会慢于O(m+n). 故使用二分搜索从右上角搜索,代码如下:
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
此题还是比较简单,就是代码不够熟练,要注意空input矩阵的判断