题目描述

在⼀个⼆维数组中(每个⼀维数组的⻓度相同),每⼀⾏都按照从左到右递增的顺序排序,每⼀列都按照从上到下递增的顺序排序。请完成⼀个函数,输⼊这样的⼀个⼆维数组和⼀个整数,判断数组中是否含有该整数。

例⼦,输⼊⼀个数组:

需要查找⼀个数字 32,则返回 true 。

思路及解答

暴⼒破解

直接暴⼒遍历,最简单,但显然,在最坏的情况下需要遍历完所有的元素才能获取结果。

如果这个数组规模是 n * m,那么时间复杂度就是 O(n × m),没有借助其他的空间,空间复杂度为 O(1) 。

  • 时间复杂度:O(n × m)

  • 空间复杂度: O(1)

⽐较查找法

题目提示了,每⼀⾏都按照从左到右递增的顺序排序,每⼀列都按照从上到下递增的顺序排序,那我们其实就可以利用矩阵的排序特性可以从右上角或左下角开始查找,从而优化搜索效率。

具体来说:从右上角开始:

  • 如果当前元素等于目标值,返回 true
  • 如果当前元素大于目标值,向左移动一列。
  • 如果当前元素小于目标值,向下移动一行。

而如果是从左上角开始找,这种两个方向都更大, 如果从右下角开始找,两个方向都更小,显然无法完成搜索。

  • 时间复杂度: O(m + n),其中 m 是行数,n 是列数。

  • 空间复杂度:O(1)