1.题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
(1)每行中的整数从左到右按升序排列。
(2)每行的第一个整数大于前一行的最后一个整数。
示例 1:
示例 2:
提示:
(1)m == matrix.length
(2)n == matrix[i].length
(3)1 <= m, n <= 100
(4)-10^4 <= matrix[i][j], target <= 10^4
2.思路
输入的 m x n 矩阵可以视为长度为 m x n的有序数组。
该数组的序号可以由row = idx // n , col = idx % n方便地转化为原矩阵中的行和列 (我们当然不会真的创建一个新数组) ,该有序数组非常适合二分查找。
3.代码
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty()){
return false;
}
int m = matrix.size();
int n = matrix[0].size();
int left = 0;
int right = m * n - 1;
while(left <= right){
int mid = (left + right) / 2;
int mid_num = matrix[mid / n][mid % n];
if(target == mid_num){
return true;
}
else if(target < mid_num){
right = mid - 1;
}
else{
left = mid + 1;
}
}
return false;
}
};
4.复杂度分析
时间复杂度:O(log(mn))
空间复杂度:O(1)