方法一:暴力法
从左至右,从上至下依次查找,如果最终找到了目标数字则返回TRUE,否则返回FALSE。
方法二:线性查找之右上角标志数法
由于给定的二维数组具备每行从左到右递增以及每列从上到下递增的特点,当访问到一个元素时,可以排除数组中的部分元素。
从二维数组的右上角开始查找。
如果当前元素等于目标值,则返回TRUE;
如果当前元素大于目标值,则移到左边一列;
如果当前元素小于目标值,则移到下边一行。
可以证明这种方法不会错过目标值。
如果当前元素大于目标值,说明当前元素的下边的所有元素都一定大于目标值,因此往下查找不可能找到目标值,往左查找可能找到目标值。
如果当前元素小于目标值,说明当前元素的左边的所有元素都一定小于目标值,因此往左查找不可能找到目标值,往下查找可能找到目标值。
伪代码:
-
若数组为空,则返回FALSE
-
初始化行下标为0,列下标为二维数组的列数减1
-
重复下列步骤,直到行下标或列下标超出边界
-
获取当前下标位置的元素num
-
如果num和target相等,返回TRUE
-
如果num大于target,列下标减1
-
如果num小于target,行下标加1
-
-
循环体执行完毕仍未找到元素等于target,说明不存在这样的元素,返回FALSE
代码:
class Solution:
def findNumberIn2DArray(self, matrix, target):
"""
:param matrix: List[List[int]]
:param target: int
:return: bool
"""
if len(matrix) ==0:
return False
if len(matrix[0]) == 0:
return False
row, col = 0, len(matrix[0])-1
while row < len(matrix) and col >= 0:
if matrix[row][col] > target:
col -= 1
elif matrix[row][col] < target:
row += 1
else:
return True
return False
方法三:线性查找之左下角标志数法
该方法与右上角标志数法有异曲同工之妙,但是这个方法可以不用判断数组是否为空。如果有空输入的话,行下标初始值row=-1,循环体不会执行,故会直接返回FALSE
伪代码:
-
初始化行下标为二维数组的行数减1,列下标为0
-
重复下列步骤,直到行下标或列下标超出边界
-
获取当前下标位置的元素num
-
如果num和target相等,返回TRUE
-
如果num大于target,行下标减1
-
如果num小于target,列下标加1
-
-
循环体执行完毕仍未找到元素等于target,说明不存在这样的元素,返回FALSE
代码:
class Solution:
def findNumberIn2DArray(self, matrix, target):
"""
:param matrix: List[List[int]]
:param target: int
:return: bool
"""
row, col = len(matrix)-1, 0
while row >= 0 and col < len(matrix[0]):
if matrix[row][col] > target:
row -= 1
elif matrix[row][col] < target:
col += 1
else:
return True
return False
Reference: