240. 搜索二维矩阵 II
编写一个高效的算法来搜索 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
示例 2:
输入: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 = 20
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-109 <= matrix[i][j] <= 109
- 每行的所有元素从左到右升序排列
- 每列的所有元素从上到下升序排列
-109 <= target <= 109
题解
是力扣 74. 搜索二维矩阵的变种,不再保障每行最尾小于下行头的值,所以两次二分无法解决,可以选择左下角或者右上角建立坐标系(因为这两个角刚好是一行最小一列最大或者一行最大一列最小的点),接下来进行判断,选择左下角:
- 如果当前值>t,则点需要往上边移动,因为上边点的值更小
- <t,右移动,寻找更大的值
- =t,寻找结束
查看代码
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int col=0,row=matrix.size()-1;//初始坐标在左下角
while(row>=0&&col<matrix[0].size()){//行往上走,最低0,列往右走,最大就是一行的长度
if(matrix[row][col]==target)
return true;
if(matrix[row][col]>=target){
row--;
}
else
col++;
}
return false;
}
};