算法

排序矩阵查找

2021-08-13  本文已影响0人  Timmy_zzh
排序矩阵查找
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。
给定 target = 20,返回 false。
2.解题思路:
    public boolean searchMatrix_v1(int[][] matrix, int target) {
        return searchMatrixSub(matrix, target, 0, 0, matrix.length - 1, matrix[0].length - 1);
    }

    /**
     * 1。先找到区域的对角线,然后遍历对角线上的元素,进行判断
     * 下面四个参数是检索区域范围
     * @param startRow 开始行
     * @param startCol 开始列
     * @param endRow   结束行
     * @param endCol   结束列
     */
    private boolean searchMatrixSub(int[][] matrix, int target, int startRow, int startCol, int endRow, int endCol) {
        if (startRow > endRow || startCol > endCol) {
            return false;
        }
        //先判断第一个元素
        if (matrix[startRow][startCol] > target) {
            return false;
        }
        //对角线个数
        int diagonal = Math.min(endRow - startRow + 1, endCol - startCol + 1);
        for (int i = 0; i < diagonal; i++) {
            //获取对角线上的元素,并进行比较,如果当前值小于目标值,而下一个元素大于目标值,则需要进行递归左下和右上两个区域进行查找目标值
            if (matrix[startRow + i][startCol + i] == target) {
                return true;
            }
            //i == diagonal - 1 查找到对角线最后一个元素了
            if (i == diagonal - 1 || matrix[startRow + i + 1][startCol + i + 1] > target) {
                return searchMatrixSub(matrix, target, startRow, startCol + i + 1, startRow + i, endCol) ||
                        searchMatrixSub(matrix, target, startRow + i + 1, startCol, endRow, startCol + i);
            }
        }
        return false;
    }
    public boolean searchMatrix(int[][] matrix, int target) {
        int row = matrix.length, col = matrix[0].length;
        int currRow = 0;//当前行
        int currCol = col - 1;//   当前列

        while (currRow < row && currCol >= 0) {
            int currValue = matrix[currRow][currCol];
            if (currValue == target) {
                return true;
            }
            if (currValue > target) {
                currCol--;
            } else {
                currRow++;
            }
        }
        return false;
    }
3.总结
上一篇 下一篇

猜你喜欢

热点阅读