问题描述
给定一个m * n的数组,从左往右和从上往下递增。例如
1 | 4 | 7 | 11 | 15 |
---|---|---|---|---|
2 | 5 | 8 | 12 | 19 |
3 | 6 | 9 | 16 | 22 |
10 | 13 | 14 | 17 | 24 |
18 | 21 | 23 | 26 | 30 |
输入:12
True
输入:16
False
分析
类似与一维的二分查找,首先有序,然后先和中间的比较,然后缩小查找范围,我们要关注的是如何缩小查找范围,假设我们和最中间的数 9 比较,比它大,我们接下来该和谁比较,我们发现接下来的区域不好描述,于是我们要找一个比较好描述的位置。于是我们想到了左下角 18和右上角 15。
假设从左下角开始比较,更大者就不在这一列了,只能在右边的列,所以下一个比较对象变成了21,更小者,则不在者一行了,比较者就变成了10,右上角如同这样的思路。这样一个好的位置给了他们更好的描述,所以这是它从这个起始比较位置的原因,比较的策略也有了,那么比较到什么时候停止比较,一 找到了该数,二找到极值点都没有找到,例如最大的30和最小的2,接下来就是代码实现了。
代码
def searchMatrix(matrix,target):
m = len(matrix) #行数
n = len(matrix[0]) #列数
row = m - 1
col = 0
while row >=0 and col < n:
if target == matrix[row][col]:
print("True")
return
elif target > matrix[row][col]:
col = col + 1
elif target < matrix[row][col]:
row = row - 1
print('False')
matrix=[[1,2,3],[2,5,6],[3,7,9]]
target = int(input(''))
searchMatrix(matrix,target)