1. 程式人生 > 實用技巧 >劍指 Offer 04. 二維陣列中的查詢

劍指 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);
}