1. 程式人生 > 其它 >二分查詢(74. 搜尋二維矩陣)

二分查詢(74. 搜尋二維矩陣)

技術標籤:演算法 & 面試

編寫一個高效的演算法來判斷 m x n 矩陣中,是否存在一個目標值。該矩陣具有如下特性:

每行中的整數從左到右按升序排列。
每行的第一個整數大於前一行的最後一個整數。

示例 1:
​​在這裡插入圖片描述
輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
輸出:true

示例 2:
在這裡插入圖片描述
輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
輸出:false

提示:

m == matrix.length
n == matrix[i].length

1 <= m, n <= 100
-10^4 <= matrix[i][j], target <= 10^4

思路

首先每行的資料從左到右依次增大,下面行的資料都比上面行的資料大。比起“楊氏矩陣”簡單了一些。其中一種思路就是可以將二維矩陣轉換為一維陣列,然後根據一維資料的位置計算二維陣列的位置

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
    	// 獲取矩陣的行數和列數
        int m = matrix.length;
        int n =
matrix[0].length; // 邊界值考慮 if (target < matrix[0][0] || target > matrix[m - 1][n - 1]) { return false; } // 二分查詢 int left = 0, right = m * n - 1, mid; while (left <= right) { mid = (left+right) >> 1 ; // 根據一維陣列對映二維陣列,mid/n就是這個數所在的行,mid % n就是這個數所在的列
int midVal= matrix[mid / n][mid % n]; if (target == midVal) { return true; } else if (target < midVal) { right = mid - 1; } else { left = mid + 1; } } return false; } }

執行用時:0 ms, 在所有 Java 提交中擊敗了100.00%的使用者
記憶體消耗:38.2 MB, 在所有 Java 提交中擊敗了11.09%的使用者