leetcode 力扣 240 搜索二维矩阵2

35 阅读1分钟

又是一道有点脑筋急转弯的意思,只需要考虑砍掉一行或一列就行了,不需要移动指针去搜索哦

为什么不要从左上角右下角开始搜索?

319f0059abe2f4128fe70f090bdb460e_searchgrid.jpg

先来看一下右上角为什么可以:

  • 对于行来说,从左往右递增,如果target 大于右上角,比最大的还要大,砍掉那一行
  • 对于列来说,从上到下递增,如果target 小于右上角,比最小的还要小,砍掉那一列
public boolean searchMatrix(int[][] matrix, int target) {
        int rows = matrix.length;
        int columns = matrix[0].length;
        int i = 0;
        int j = columns - 1;

        while (i < rows && j >= 0) {
            if (matrix[i][j] == target) {
                return true;
            }

            if (target > matrix[i][j]) {
                i++;
            } else {
                j--;
            }
        }

        return false;
}

再来看一下左下角为什么可以:

  • 对于行来说,从左到右递增,如果target 大于左下角,往右寻找
  • 对于列来说,从下到上递减,如果target 小于左下角,比最小的还要小,砍掉那一行
public boolean searchMatrix(int[][] matrix, int target) {
        int rows = matrix.length;
        int columns = matrix[0].length;
        int i = rows - 1;
        int j = 0;

        while (i >= 0 && j < columns) {
            if (matrix[i][j] == target) {
                return true;
            }

            if (target < matrix[i][j]) {
                i--;
            } else {
                j++;
            }
        }

        return false;
}

再来看一左上角右下角为什么不可以:
沿着行和列都是递增或递减,其实可以的,但是代码就不是这个画风了,时间复杂度也是O(mn)

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int rows = matrix.length;
        int columns = matrix[0].length;

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                if (matrix[i][j] == target) {
                    return true;
                }

                if (matrix[i][j] > target && i < rows - 1) {
                    if (j == 0) {
                        return false;
                    }

                    for (int row = i + 1, k = j - 1; k < columns; k++) {
                        if (matrix[row][k] == target) {
                            return true;
                        }

                        if (matrix[row][k] > target) {
                            break;
                        }
                    }
                    break;
                }
            }
        }

        return false;
    }
}