题目
在一个n*m的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 matrix 如下:
[
[1, 2, 8, 9],
[2, 4, 9, 12],
[4, 7, 10, 13],
[6, 8, 11, 15],
]
给定 target = 7,返回 true。给定 target = 5,返回 false。
思路
首先选取数组中右上角的数字。
如果该数字等于target,则查找过程结束;
如果该数字大于target,则剔除这个数字所在列;
如果该数字小于target,则剔除这个数字所在行。
直到找到target或查找范围为空。
实例分析
以target=7为例。首先数组选取右上角的数字9,9>7,按照数组的排列规律,9下面的数字都大于7,所以剔除这一列。分析前三列,右上角的数字为8,8>7,同样剔除这一列。分析前两列,右上角的数字为2,2<7,那么7可能在2的右边或者下边,右边列已经剔除,所以7只能在2的下边,于是将2所在行也剔除。此时数组中右上角的数字为4,4<7,同理,剔除4所在行。现在只剩下两行两列,右上角的数字刚好就是我们要寻找的7,查找结束。
测试用例
1、二位数组中包含target(target是数组中的最大值或者最小值;target介于数组中最大值和最小值之间)
2、二位数组中没有target(target大于最大值;小于最小值;在最大值和最小值之间但是不存在)
解法
class Solution:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
if len(matrix)>0 and len(matrix[0]):
row = 0
column = len(matrix[0])-1
while row<len(matrix) and column>=0 :
if matrix[row][column]==target:
return True
elif matrix[row][column]>target:
column-=1
else:
row+=1
return False
复杂度分析
从上面的实例分析可以看出,最坏情况下要查找的数字刚好在数组的左下角,此时需要花费的时间是数组的列数加行数,即O(m+n).