劍指 Offer 04. 二維陣列中的查詢
阿新 • • 發佈:2020-06-28
/** * @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);
}