题目
编写一个高效的算法来判断 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)
因为从左到右升序, 从上到下升序。所以每次可以去掉一行 / 一列。
具体参见 剑指Offer
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0) return false;
int row = 0;
int col = matrix[0].length - 1;
while(row < matrix.length && col >= 0) {
if(matrix[row][col] == target) {
return true;
} else if(matrix[row][col] > target) {
col --;
} else {
row ++;
}
}
return false;
}
}
结果
解法二:O(log(mn))
将二维的数组转化成一维的数组考虑。
假设在一维数组中下标为 idx。
那么转化方式:num[idx] = matrix[idx / col][idx % col]
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0) return false;
int row = matrix.length;
int col = matrix[0].length;
int l = 0;
int r = row * col - 1;
while(l <= r) {
int mid = l + (r - l) / 2;
if(matrix[mid / col][mid % col] == target) {
return true;
} else if(matrix[mid / col][mid % col] > target) {
r = mid - 1;
} else {
l = mid + 1;
}
}
return false;
}
}