题目
方法一-暴力求解
不考虑有序的特点,直接遍历整个二维数组
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return false;
}
int rows = matrix.length, columns = matrix[0].length;
for(int i = 0; i < rows; i++){
for(int j = 0; j < columns; j++){
if(matrix[i][j] == target){
return true;
}
}
}
return false;
}
}
- 时间复杂度:O(mn),二维数组大小
- 空间复杂度:O(1)
方法二-线性查找
该二维数组可以看做一个根在右上角的排序二叉树。
利用二维数组元素之间的大小关系,从右上角开始查找,若当前元素等于目标值直接返回true,若小于目标值,移到下边一行查找,若大于目标值,移到左边一列查找。
具体算法步骤:
- 若数组为空,返回false
- 初始化行下标为0,列下标为二维数组的列数减1
- 重复以下步骤直至行下标或列下标出界:
获得当前下标位置的元素num
若num == target,返回true;
若num > target,列下标减1;
若num < target,行下标加1; - 若循环体执行完毕仍未找到等于target的元素,则返回false
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return false;
}
int rows = matrix.length, columns = matrix[0].length;
int row = 0, column = columns - 1;//右上角元素下标
while(row < rows && column >= 0){
int num = matrix[row][column];//获得当前下标位置的元素num
if(num == target){
return true;
}else if(num > target){
column--;
}else{
row++;
}
}
return false;
}
}
- 时间复杂度:O(m+n),行下标最多增加n次,列下标最多减少m次,因此循环体最多执行m+n次
- 空间复杂度:O(1)