剑指 Offer 04. 二维数组中的查找

/**
 * @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);
}
posted @ 2020-06-28 16:00  枫叶艾辰  阅读(84)  评论(0编辑  收藏  举报