一、给出的是方阵
[[1,6,7,8],
[3,7,8,9],
[9,10,11,12],
[12,13,14,15]]
这种情况非常简单,可知对角线元素应为查找元素,如果target大于对角线上某个元素,那么以此对角线为中心,左边、上边的元素应该都小于target
此时只需要找到一个对角线上的点,当找个一个刚刚好大于target的元素,那么左边和上边进行二分查找即可,python代码如下: # -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
h, w = len(array), len(array[0])
for i in range(min(h, w)): # 在正方形内对角线查找
if array[i][i] == target:
return True
elif (array[i][i] > target):
for j in range(i): # 这里可以替换成二分查找
if (array[i][j] == target or array[j][i] == target):
return True
return False
考虑到非方阵情况例如
[[1,6,7,8],
[3,7,8,9],
[9,10,11,12],
[12,13,14,15],
[13,14,15,16],
[,18,21,22,23]]
其中array的shape=(6,4)
这时候就不能单一按照对角线考虑,应该将矩阵分块,分成多个小方阵,利用递归的方式现将矩阵分块,然后每一个小方阵按照上述对角线方式查找,python代码如下 # -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
h, w = len(array), len(array[0])
if (h==0 or w==0):
# 递归退出条件,当矩阵不可再分时候,此时为行向量,顺序查找或者二分查找
for i in range(max(h,w)):
if(target == array[i]):
return True
return False
# 如果按照方阵情况查找
for i in range(min(h, w)): # 在正方形内对角线查找
if array[i][i] == target:
return True
elif (array[i][i] > target):
for j in range(i): # 这里可以查找二分查找
if (array[i][j] == target or array[j][i] == target):
return True
if (h > w): # 如果不是方阵,则递归划分成多个小方阵查找
return self.Find(target, [row[:w] for row in array[i+1:]])
else:
return self.Find(target, [row[i+1:] for row in array[:h]])