题目
剑指offer04:二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
1 | matrix = [ |
给定 target = 5,返回 true。
给定 target = 20,返回 false。
代码
方案1:暴力破解
直接遍历二维数组。
存在元素=target,返回true,否则,返回false。
显然,暴力破解并没有用到题目给数组的限制条件:
每一行都按照从左到右递增的顺序排序
每一列都按照从上到下递增的顺序排序
正因为如此,恰好验证了暴力破解不是该题目高效的算法。
1 | class Solution { |
方案2:算法优化
抓有特征的元素。
在这里是左下角元素和右上角元素:
左下角元素:所在行元素,均比它大;所在列元素,均比它小。
右上角元素:所在行元素,均比它小;所在列元素,均比它大。
选择一个有特征的元素即可。
将左下角元素作为flag(标志元素):
1 | class Solution { |
将右上角元素作为flag(标志元素):
1 | class Solution { |
随笔
复杂度分析
方案1:
时间复杂度:O(n * m),最多循环 n * m 次。
空间复杂度:几个变量使用常数大小的额外空间。
方案2:
时间复杂度:O(n + m),最多循环 n + m 次。
空间复杂度:几个变量使用常数大小的额外空间。