题目描述
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目分析
在右上角看,矩阵可以看作一棵二叉搜索树BST。
- 若matrix = null或者matrix长度为0,则返回false。
- 若target 大于右上角值,则 row ++;
- 若target 小于右上角值,则 col --;
- 若target 等于右上角值,则返回true;
- 如果到step4还没有返回,则没找到,返回false;
代码实现
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) {
return false;
}
int n = matrix.length;
int m = matrix[0].length;
int row = 0;
int col = m - 1;
while(row < n && col >= 0) {
if(target > matrix[row][col]){
row++;
}
else if(target < matrix[row][col]){
col --;
}
else{
return true;
}
}
return false;
}
}
复杂度分析
时间复杂度:O(n + m)。while循环内,if最多分别执行n次和m次。
空间复杂度:O(1)。 只使用了常数个变量。