问题是这样的:给定一个 min 的二维数组,其中每行的元素从左到右升序排序,每列的元素从上到下升序排序,又给定一个目标值,请返回目标值是否存在于二维数组里。这个问题与二分查找有相似之处,不同的是搜索范围从一维数据结构变成了二维数据结构。
问题示例:
[
[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
输入目标值= 45
输出:False
我们可以怎样利用矩阵的特殊条件呢?如图 1 所示,通过观察发现,每一个元素都是以它为左上角的矩阵中的最小值。
图 1:思路一
因此,如果目标值小于左上角的值,那目标值肯定不在矩阵里面,我们可以直接返回 False。问题是如果目标值大于左上角的值怎么办,我们应该如何确定目标值位于矩阵中?
一个办法是一排一排地检查,另一个办法是把矩阵划分成两个或四个子矩阵再递归检查。但是有一个更好的办法,它需要我们换一个思路,从观察矩阵的左下角的值开始。
如图 2 所示,暂时用 x 代称左下角的值。通过观察得出,同行的值都大于 x,同列的值都小于 x。