21.搜索二维矩阵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
代码:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
//m,n分别为矩阵的长和宽
int m = matrix.length,n = matrix[0].length;
//(x,y)起始为矩阵的右上角坐标
int x = 0,y = n-1;
//(x,y)不断Z字型向左下角收缩,只要还没越界,就不断搜索
while(x<m&&y>=0){
//如果当前位置元素等于target,直接返回true
if(matrix[x][y]==target)return true;
//如果当前元素大于target,由于每列元素从上到下升序排序,所以当前一整列的元素都不满足要求,向左移动一列,纵坐标-1
if(matrix[x][y]>target)y--;
//如果当前元素小于target,由于每行元素从左到右升序排序,所以当前一整行的元素都不满足要求,向下移动一行,横坐标+1
else x++;
}
//如果整个矩阵都遍历完了还没有return,说明找不到,直接返回false
return false;
}
}

浙公网安备 33010602011771号