/**
* @Class FindNumberIn2DArray
* @Description 剑指 Offer 04. 二维数组中的查找
* 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
* 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
* <p>
* 示例:
* 现有矩阵 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。
* <p>
* 限制:
* 0 <= n <= 1000
* 0 <= m <= 1000
* @Author
* @Date 2020/6/28
**/
public class FindNumberIn2DArray {
}
/**
* 解法1:最简单的方式是,逐个查找
*/
public static boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) return false;
int m = matrix.length;
int n = matrix[0].length;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == target) return true;
}
}
return false;
}
/**
* 方式2: 利用每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
* 先对同一列从上到下找到 第一个等于或者大于target的元素matrix[x][0],这样的话x行之后的元素都肯定比target大
* 然后同样的方式遍历下一列,逐步缩小查找范围,直到查找结束
*/
public static boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) return false;
int m = matrix.length;
int n = matrix[0].length;
int p = 0, q = 0;
while (p < m && q < n) {
while (p < m && matrix[p][q] < target) p++;
if (p < m && matrix[p][q] == target) return true;
q++;
p = 0;
}
return false;
}
/**
* 方式3:和2类似,但是从后向前,从上到下遍历,保证遍历过程的时间复杂度是线性的
*/
public static boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) return false;
int rows = matrix.length;
int cols = matrix[0].length;
int row = 0, col = cols - 1;
while (row < rows && col >= 0) {
int num = matrix[row][col];
if (num == target) return true;
if (num > target) col--;
else row++;
}
return false;
}
// 测试用例
public static void main(String[] args) {
int[][] matrix = new int[][]{
{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}
};
int target = 5;
boolean ans = findNumberIn2DArray(matrix, target);
System.out.println("demo01 result:" + ans);
target = 20;
ans = findNumberIn2DArray(matrix, target);
System.out.println("demo02 result:" + ans);
}