74、搜尋二維矩陣
給你一個滿足下述兩條屬性的 m x n
整數矩陣:
- 每行中的整數從左到右按非嚴格遞增順序排列。
- 每行的第一個整數大於前一行的最後一個整數。
給你一個整數 target
,如果 target
在矩陣中,返回 true
;否則,返回 false
。
示例 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
【思路】
由於每行的第一個元素大於前一行的最後一個元素,且每行元素是升序的,所以每行的第一個元素大於前一行的第一個元素,因此矩陣第一列的元素是升序的。可以對矩陣的第一列的元素二分查詢,找到最後一個不大於目標值的元素,然後在該元素所在行中二分查詢目標值是否存在。
//非二分查詢法
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;
}
}