编写一个高效的算法来搜索 m x n
矩阵 matrix
中的一个目标值 target
。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例 1:
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5 输出:true
方法一:二分法
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
//二分法
int n = matrix[0].size(); //列数
int m = matrix.size(); //行数
for(int i=0; i<m; i++){
int right = n-1;
int left = 0;
while(left<=right){
int mid = left+(right-left)/2;
if(matrix[i][mid]>target){
right= mid-1;
}
else if(matrix[i][mid]<target){
left= mid+1;
}
else{
return true;
}
}
}
return false;
}
};
方法二:二叉树 从右上角开始搜索
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0)
return false;
int row = 0;//行
int col = matrix[0].size()-1; //列
while(row <= matrix.size()-1 && col >= 0){
if(target > matrix[row][col])
row++; //向下走
else if(target < matrix[row][col])
col--; //向左走
else
return true;
}
return false;
}
};