一、题目
二、方法(暴力+ 线性查找)
暴力搜索 -- O(n * m)
最简单的肯定就是暴力搜索,由于n 和 m 都是1000, 所以n *m 最大为 1000000 < 1e8
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
// 1.n * m
int n = matrix.length;
if(n == 0) return false;
int m = matrix[0].length;
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
if(target == matrix[i][j])return true;
}
}
return false;
}
}
线性查找 - O(n + m)
很显然,题目给出的递增条件还没用,所以肯定还有更好的方法减少时间复杂度 .
一开始看见递增,很自然会想到用二分尝试一下试试,left = 0 , right = n * m - 1,能过一些用例。思考后发现,把二维的数组转化为一维数组,使用二分的前提是要满足这个一维数组单具有二分性,很显然没有。--失败
然后接着想使用两次二分看看能不能解决,比如先使用行二分,确定行的位置;再使用列二分,确定列的位置,发现这样也是不行的。随便找两个例子就能说明了 ---失败
然后就去翻答案了....
线性查找---优秀
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
// 1.n * m
// int n = matrix.length;
// if(n == 0) return false;
// int m = matrix[0].length;
// for(int i = 0 ; i < n ; i++){
// for(int j = 0 ; j < m ; j++){
// if(target == matrix[i][j])return true;
// }
// }
// return false;
//2.线性查找n + m---不是二分!!!!
int n = matrix.length;
if(n == 0) return false;
int m = matrix[0].length;
if(m == 0) return false;
int i = 0, j = m - 1;
while(i < n && j >= 0){ // i 最多执行 n 次 , j 最多执行 m次 ,所以时间复杂度O(n + m);
if(matrix[i][j] == target)return true;
else if(matrix[i][j] < target)i++;
else j--;
}
return false;
}
}