题目描述:
链接: https://leetcode-cn.com/problems/search-a-2d-matrix/submissions/
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false
解法一: O(m+n), S(1)
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) return false;
int i = 0, j = matrix[0].length - 1;
while (i < matrix.length && j >= 0) {
if (target > matrix[i][j]) {
i++;
} else if (target < matrix[i][j]) {
j--;
} else {
return true;
}
}
return false;
}
}解法二: O(log(m*n)), S(1) 二分法
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) return false;
int n = matrix.length, m = matrix[0].length;
int low = 0, high = n * m - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
// 从一维坐标转换至二维坐标
int x = mid / m;
int y = mid % m;
if (target > matrix[x][y]) {
low = mid + 1;
} else if (target < matrix[x][y]) {
high = mid - 1;
} else {
return true;
}
}
return false;
}
}题目分析:
(1)这道题和搜索二维矩阵 II 很相似, 从右上角开始遍历, 如果target小于当前matrix[i][j], 排除本列, 如果大于, 排除本行.
(2)因为所有的都是升序, 所以我们用一维做二分, 转换成二维坐标即可. 总元素: NM个, 所以时间复杂度O(log(nm))

京公网安备 11010502036488号