21.搜索二维矩阵II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例1:
image

输入: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:
image

输入: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;
    }
}
posted @ 2025-04-19 09:19  回忆、少年  阅读(34)  评论(0)    收藏  举报