二维数组中的找数|刷题打卡

133 阅读1分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

一、题目描述

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例:

现有矩阵 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

限制:

0 <= n <= 1000
0 <= m <= 1000

二、思路分析

我的思路

  1. 暴力破解,遍历数组去找这个数(显然题意不是要这种的)
  2. 左上角开始,遇到大的往下走? 还是不行!当遇到比当前大,不知道往下还是往后走!

最佳思路

站在右上角看。这个矩阵其实就像是一个Binary Search Tree。然后二分查找就行了!还有一点:注意边界。最好画个图出来,标记x,y,不然容易记混了。

重点:从右上角去看!!!!从右上角去看!!!!从右上角去看!!!!

三、AC 代码

public static boolean findNumberIn2DArray(int[][] matrix, int target) {
    // 边界问题,一定先考虑
    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
        return false;
    }

    int h = matrix.length;
    int w = matrix[0].length;

    int curX = w - 1;
    int curY = 0;

    while (curX >= 0 && curY < h) {
        int value = matrix[curY][curX];
        if (value == target) {
            return true;
        }
        if (value < target) {
            curY++;
        } else {
            curX--;
        }
    }
    return false;
}

四、总结

这个题目算属于套路题,主要记住这个套路,就能很简单的解出来。当然对于矩阵中数据的特性也是应该能想到从右上角这个角度出发的。