二分查詢(74. 搜尋二維矩陣)
阿新 • • 發佈:2021-01-16
技術標籤:演算法 & 面試
編寫一個高效的演算法來判斷 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].length1 <= 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%的使用者