1.暴力解题
对空间进行遍历
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;
for(int i = 0 ; i < n; i++){
for(int j = 0; j < m; j++){
if(matrix[i][j] ==target){
return true;
}
}
}
return false;
}
}
时间复杂度:O(nm)。二维数组中的每个元素都被遍历,因此时间复杂度为二维数组的大小。
空间复杂度:O(1)。
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 i = 0,j = m-1;
while (i < n && j >= 0){
if(matrix[i][j] < target){
i++;
}
else if (matrix[i][j] > target){
j--;
}
else{
return true;
}
}
return false;
}
}
时间复杂度:O(n+m) 。 在循环语句中,除非直接返回结果,否则每一次行都会递减一次或者列都会递增一次。该矩阵共有 m 行 n 列,因此循环终止之前,循环不会运行超过 n+m 次。其它的操作都是常数,所以总的时间复杂度是线性的。
空间复杂度:O(1)。没有使用额外的存储空间,所以它的内存占用是恒定的。
3.二分写法
public static boolean erfen(int[][] matrix, int target ){
int m = matrix.length, n = matrix[0].length;
if(m == 0) return false;
int left = 0,right =n * m - 1, mid ;
while(left <= right){
mid = (left + right) >>1;
int zz = matrix[mid / n][mid % n];
if(zz > target) right = mid -1;
else if (zz < target) left = mid + 1;
else return true;
}
return false;
}
时间复杂度 : 由于是标准的二分查找,时间复杂度为O(log(m n))。
空间复杂度 : O(1)。