题目描述:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]给定 target = 5,返回 true。
给定 target = 20,返回 false。
思路一:暴力法
时间复杂度:O(m*n)
//方法一:暴力法
public boolean findNumberIn2DArray(int[][] matrix, int target) {
//二维数组的行数=matrix.lenth,列数=matrix[0].length
int row = matrix.length;
//特殊情况:如果数组为空,行=0 或 列=0
if(matrix == null || row==0 || matrix[0].length==0){
return false;
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < matrix[i].length; j++) {
if(target==matrix[i][j]){
return true;
}
}
}
return false;
}
思路二:线性查找。
因为数组是有规律排列的,先从右上角开始找,分以下两种情况:
1、如果要查找的元素target小于右上角的数字,则排除右上角数字所在的列。即col–
2、如果要查找的元素小于右上角的数字,则排除右上角数字所在的行.即row++
代码编写思路:
- 初始情况:row=0,col=二维数组的列数-1
- 重复以下步骤,直到到达行边界或列边界
- if ( target > arr [row,col ] ) row++
- if(target < arr[row,col] ) col–
- if(target = arr[row,col] ) return true
如果没有找到就返回false
public boolean findNumberIn2DArray_02(int[][] matrix, int target) {
//特殊情况
if(matrix.length==0 || matrix[0].length==0 || matrix==null){
return false;
}
//二维数组的行数和列数
int rows = matrix.length;
int cols = matrix[0].length;
//初始情况下的行=0
int row = 0;
//初始情况下的列=cols-1
int col = cols-1;
//以下部分有循环的条件:就是行和列到达边界
while (row<rows && col >=0) {
//这个表示右上角的数字,用num和target做比较
int num = matrix[row][col];
if (num > target) {
col--;
}
if (num < target) {
row++;
}
if (num == target) {
return true;
}
}
return false;
}