难度:中等
编写一个高效的算法来判断 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
题目分析:
看见有序的矩阵,那么显然使用二分法查找。先判断在哪一行,然后在这行使用二分法查找。
参考代码:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
//如果matrix为空,或者[[]]这样的情况,或者target不在范围内,那么直接返回false
if(matrix.empty() || matrix[0].empty() || target < matrix[0][0] || target > matrix[matrix.size()-1][matrix[0].size()-1])
return false;
//建立双指针
int left = 0;
int right = matrix[0].size()-1;
for(int i = 0; i < matrix.size(); ++i)
{
//发现在这一列,使用二分法查找
if(target >= matrix[i][0] && target <= matrix[i][right])
{
int mid = (left + right)/2;
while(left <= right)
{
mid = (left + right)/2;
if(matrix[i][mid] > target)
{
right = mid-1;
}else if(matrix[i][mid] < target)
{
left = mid + 1;
}else{
return true;
}
}
return false;//没找到直接返回false
}
}
return false;
}
};