编写一个高效的算法来搜索 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 <= matix[i][j] <= 109
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -109 <= target <= 109
Related Topics
  • 二分查找
  • 分治算法
  • \n
  • 👍 643
  • 👎 0
  • 解答

    public class LeetCode240Test {
    
    
        public static class Vector{
            private int x;
            private int y;
    
            public int getX() {
                return x;
            }
    
            public void setX(int x) {
                this.x = x;
            }
    
            public int getY() {
                return y;
            }
    
            public void setY(int y) {
                this.y = y;
            }
        }
    
    
        public boolean searchMatrix(int[][] matrix, int target) {
            if (matrix.length==0){
                return false;
            }
            if (matrix[0].length == 0){
                return false;
            }
            int rowCount = matrix.length;
            int colCount = matrix[0].length;
    
            Vector vector = new Vector();
            vector.setX(0);
            vector.setY(rowCount-1);
            while (vector.getX() <= colCount-1 && vector.getY()>=0 && vector.getX() >=0){
                int value = matrix[vector.getY()][vector.getX()];
                if (value == target){
                    return true;
                }else if (value > target){
                    //上移
                    vector.setY(vector.getY()-1);
                }else{
                    //右移
                    vector.setX(vector.getX()+1);
                }
            }
            return false;
        }
    }

    上面的解题思路是最取巧的,看了分析之后,发现应该有4种方法。正常来说,我看到这题的时候第一思路是看成一颗二叉树,遍历探测。

    具体有时间的,后面再补上