74_搜尋二維矩陣

鲍宪立發表於2024-07-20

74、搜尋二維矩陣

給你一個滿足下述兩條屬性的 m x n 整數矩陣:

  • 每行中的整數從左到右按非嚴格遞增順序排列。
  • 每行的第一個整數大於前一行的最後一個整數。

給你一個整數 target ,如果 target 在矩陣中,返回 true ;否則,返回 false

示例 1:

img

輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
輸出:true

示例 2:

img

輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
輸出:false

【思路】

由於每行的第一個元素大於前一行的最後一個元素,且每行元素是升序的,所以每行的第一個元素大於前一行的第一個元素,因此矩陣第一列的元素是升序的。可以對矩陣的第一列的元素二分查詢,找到最後一個不大於目標值的元素,然後在該元素所在行中二分查詢目標值是否存在。

//非二分查詢法
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int i = 0;
        for (i = matrix.length - 1; i > 0 ; i--) {
            if (matrix[i][0] <= target) {
                break;
            }
        }
        for (int j = 0; j < matrix[i].length; j++) {
            if (matrix[i][j] == target) 
                return true;
        }
        return false;
    }
}

//改為二分查詢的方式來做

class Solution {
	public boolean searchMatrix(int[][] matrix, int target) {
		int rowIndex = binarySearchFirstColumn(matrix, target);
		if (rowIndex < 0) {
			return false;
		}
		return binarySearchRow(matrix[rowIndex], target);
	}
    public int binarySearchFirstColumn(int[][] matrix, int target) {
        int low = -1, high = matrix.length - 1;
        while (low < high) {
            int mid = (high - low + 1) / 2 + low;
            if (matrix[mid][0] <= target) {
                low = mid;
            } else {
                high = mid - 1;
            }
        }
        return low;
    }
    
    public boolean binarySearchRow(int[] row, int target) {
        int low = 0, high = row.length - 1;
        while (low <= high) {
            int mid = (high - low) / 2 + low;
            //用原來的也可以
            //int mid = (high + low) / 2;
            if (row[mid] == target) {
                return true;
            } else if (row[mid] > target) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return false;
    }
}

相關文章