编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例:
现有矩阵 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
。
给定 target = 20
,返回 false
。
分析:
1. 暴力搜索O(m*n)
2. 注意观察左下角和右上角的数字,以左下角为例,上面的数字都小于它,右面的数字都大于它,那么,如果target大于它就往右边搜索,小于它就往左边搜索,知道找到或者数组越界,使用递归完成。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
// 左下角的数字,往上比它小,往右比它大,可以递归完成寻找
// 从右上角开始也可以
if(matrix.size() == 0) return false;
// 横纵坐标
int x = matrix.size()-1;
int y = 0;
return find(matrix, x, y, target);
}
// 从x,y开始找target
bool find(vector<vector<int>>& matrix, int x, int y, int target){
if(x<0 || y>=matrix[0].size())return false;
if(matrix[x][y] == target) return true;
// 小于目标值就往右边寻找
else if(matrix[x][y] < target) return find(matrix, x, y+1, target);
// 大于目标值就往上边找
else return find(matrix, x-1, y, target);
}
};