【分析】
现在一看到题,第一反应,暴力求解。虽然不用费脑子,但是时间复杂度高啊。
这道在二维数组中查找目标值的题,也可以暴力查找,复杂度O(mn)。但是,这样题目给定的"每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序"就毫无用处了。
所以,还是要动动小脑袋。
根据题目给定的条件,数组中的值沿主对角线方增大,如图所示:
对于(i,j)位置的元素来讲,左上都比它小,右下都比它大。这就提供了一个思路,从右上角开始查找目标值,根据目标值的大小向左向下移动。如果目标值大,往下找;如果目标值小,往左找。
【示例】
给定目标值5:
给定目标值20:
【代码】
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int n = matrix.length, m = matrix[0].length;
int row = 0, col = m-1;
while(row<n && col>=0){
int num = matrix[row][col];
if(num == target){
return true;
} else if(num > target){
col--;
} else{
row++;
}
}
return false;
}
}