1. 暴力法遍历
双重循环遍历二维数组,直到matrix[i][j]==target
,返回true
。未利用到题目中所说的行递增、列递增的特点。
- 二维数组的行列长度判断:行长度
matrix.length
;列长度matrix[0].length
- 二维数组为空的判断
matrix[0].length=0和matrix.length=0都代表矩阵为空,只有一行或一列的情况必有一length=1,而非0.
f a l s e = { m a t r i x . n u l l 首地址为空 m a t r i x . l e n g t h = = 0 二维数组是否为{ } m a t r i x . l e n g t h = = 1 & & m a t r i x [ 0 ] . l e n g t h = = 0 二维数组是否为{{}} false= \begin{cases} matrix.null& \text{首地址为空}\\ matrix.length==0& \text{二维数组是否为\{ \} }\\ matrix.length==1 \&\& matrix[0].length==0 & \text{二维数组是否为\{\{\}\}} \end{cases} false=⎩⎪⎨⎪⎧matrix.nullmatrix.length==0matrix.length==1&&matrix[0].length==0首地址为空二维数组是否为{ } 二维数组是否为{{}}
即:if(matrix==null || matrix.length==0 || matrix[0].length==0) { return false;}
- 时间复杂度O(n*m);空间复杂度O(1)
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix==null || matrix.length==0 || matrix[0].length==0) {
return false;
}
int rowlength = matrix.length;
int colength = matrix[0].length;
for(int i=0;i<rowlength;i++) {
for(int j=0;j<colength;j++) {
if(matrix[i][j]==target)
return true;
}
}
return false;
}
2. 逐行二分查找
利用了行递增的特点:每行数据均有序,首先想到的就是利用二分查找的方法查找元素。
matrix[i]
表示第i行的元素,即一维数组。- java提供了二分查找的方法Arrays.binarySearch(int[] a,int key),jdk1.8源码
- 时间复杂度O(n*logm);空间复杂度O(1);
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix==null || matrix.length==0 || matrix[0].length==0) {
return false;
}
int rowlength = matrix.length;
for(int i=0;i<rowlength;i++) {
if(Arrays.binarySearch(matrix[i], target) >= 0)
return true;
}
return false;
}
3. 矩阵消除法(自命名)
利用行递增、列递增的特点:矩阵的右上角元素是该行的最大值、该列的最小值,那么:
(1)若target>当前元素
,target在该元素所在行的下方,即可消去该元素的所在行
(2)若target<当前元素
,target在该元素所在列的左方,即可消去该元素的所在列
- 最多查找次数是从右上角查找,而target恰好在左下角才找到或找不到的情况(走了直角),即m+n次查找。
- 时间复杂度O(n+m),空间复杂度O(1)
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix==null || matrix.length==0 || matrix[0].length==0) {
return false;
}
int rowlength = matrix.length;
int colength = matrix[0].length;
int i=rowlength-1, j=0;
while(i>=0 && j<colength) {
if(target>matrix[i][j])
j++;
else if(target<matrix[i][j])
i--;
else return true;
}
return false;
}