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
-104 <= matrix[i][j], target <= 104
题解1:两次二分查找法
/*
* @lc app=leetcode.cn id=74 lang=java
*
* [74] 搜索二维矩阵
*/
// @lc code=start
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// 两次二分查找
// 时间复杂度:O(logmn)
// 空间复杂度:O(1)
int rowIndex = binarySearchFirstColumn(matrix, target);
if (rowIndex < 0) {
return false;
}
return binarySearchRow(matrix[rowIndex], target);
}
private boolean binarySearchRow(int[] row, int target) {
int low = 0, hi = row.length - 1;
while (low <= hi) {
int mid = low + (hi - low) / 2;
if (row[mid] > target) {
hi = mid - 1;
} else if (row[mid] < target) {
low = mid + 1;
} else {
return true;
}
}
return false;
}
private int binarySearchFirstColumn(int[][] matrix, int target) {
int low = -1, hi = matrix.length - 1;
while (low < hi) {
int mid = low + (hi - low + 1) / 2;
if (matrix[mid][0] > target) {
hi = mid - 1;
} else {
low = mid;
}
}
return low;
}
}
题解2:一次二分查找
/*
* @lc app=leetcode.cn id=74 lang=java
*
* [74] 搜索二维矩阵
*/
// @lc code=start
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// 一次二分查找
// 时间复杂度:O(logmn)
// 空间复杂度:O(1)
int m = matrix.length, n = matrix[0].length;
int low = 0, high = m * n - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
int x = matrix[mid / n][mid % n];
if (x > target) {
high = mid - 1;
} else if (x < target) {
low = mid + 1;
} else {
return true;
}
}
return false;
}
}