解题思路参考题解区漫漫云天自翱翔
由于行列递增,可以得出:
a.在一列中的某个数字,其上的数字都比它小
b.在一行中的某个数字,其右的数字都比它大
搜索流程:
a.首先从数组左下角搜索.
b.如果当前数字大于target,那么查找往上移一位,如果当前数字小于target,那么查找往右移一位。
c.查找到target,返回true; 如果越界,返回false。
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param target int整型
# @param array int整型二维数组
# @return bool布尔型
#
class Solution:
def Find(self , target: int, array: List[List[int]]) -> bool:
#特殊情况
if array==[[]]:
return False
row=len(array)#总行数
col=len(array[0])#总列数
#左下角的坐标
i=row-1
j=0
while array[i][j]!=target:
if array[i][j]>target:
i=i-1
else:
j=j+1
if i==-1 or j==col:#搜索到边界了
return False
return True
时间复杂度:O(M+N)
空间复杂度:O(1)
另外,还有双二分查找的思路。 利用数组行列递增特性。一维的二分查找可以舍弃一半的查找范围,二维的二分可以舍弃左上部分或者右下部分1/4的查找范围。
时间复杂度:O(logM*logN)
空间复杂度:O(1)