给你一个满足下述两条属性的 m x n
整数矩阵:
- 每行中的整数从左到右按非递减顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target
,如果 target
在矩阵中,返回 true
;否则,返回 false
。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3 输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13 输出:false
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size(), n = matrix[0].size();
int i = m - 1, j = 0;
while (i >= 0 && i < m && j >= 0 && j < n){
if (matrix[i][j] == target)
return true;
else if (matrix[i][j] > target){
i--;//往上走
}
else
j++;//往右走
}
return false;
}
};
从第一列逆时针到最后一行(例如【1,10,23,30, 34,60】)是单调递增的,其他行列也是如此,因此可以用二分查找,如果目前值大于target,则往上走,即收缩右区间,如果小于target则往右走,即收缩左区间。