剑指 Offer 04. 二维数组中的查找
题目
在一个 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。
限制:
0 <= n <= 1000
0 <= m <= 1000
解答
暴力法
/**
* 1. 暴力法
* @param matrix
* @param target
* @return
*/
public static 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;
}
找规律
/**
* 找规律: 在所列举的例子中,如果 我们想判断二维数组是否存在元素13,可以通过如下过程:
* 1. 将13 和右上角的15比较,15 > 13, 由于15是这一列最小的数,所以第5列的其他元素肯定没有13.剔除第5列
* 2. 将13 和 剩下列的右上角的11比较, 13 > 11, 由于11是余下矩阵中这一行最大的元素,所以 11 这一行不可能有13,剔除第1行
* 3. 将13 和 余下矩阵中的右上角元素12比较, 13 > 12, 12 是这一行最大元素,剔除第2行
* 4. 将13 和 余下矩阵中的右上角元素 16比较, 16 > 11 , 11 这一列不可能有12, 剔除第4列
* 5. 将13 和 余下矩阵中的右上角元素9比较, 11 > 9, 剔除第3行
* 6. 将13 和 14 比较,14 > 13 ,剔除第3列
* 7. 将13 和 13 比较 13 = 13 找到元素,返回true。
* @param matrix
* @param target
* @return
*/
public static boolean findNumberIn2DArray2(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 row = 0, col = m - 1;
while(row < n && col >= 0){
if(matrix[row][col] == target)
return true;
else if(matrix[row][col] > target)
--col;
else
++ row;
}
return false;
}