剑指Offter——二维数组中查找

200 阅读1分钟

题目: 二维数组中查找

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

对于以下二维数组: 1 3 5 6, 2 5 7 8, 3 4 8 9, 3 4 5 9, 如果查找数字0,则返回false,查找数字5,则返回true。

解题思路

碰到数组这简单呀,撸起袖子遍历整个数组就ok了,是呀。这一切都Ok了,没有毛病。但是细细想想没有优化的地方吗??

仔细审题,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,那我们可以根据这个规则来,减少判断次数。

根据上面的例子。假如我们需要查找9这个整数,找到数组的第一行最后一列6,这是后9>6,就不需要匹配第一行的元素了,直接第2行第4列的的元素8,发现9>8,这时候也不需要比较第二行元素,跳转第3行第4列的元素9,发现9=9,则找到目标数。。这样的做法可以减少部分的比较。

解题代码

    private static boolean find(int[][] maxtrix, int target) {

        if (maxtrix == null || maxtrix.length == 0 && maxtrix[0].length == 0) {

            int rows = maxtrix.length;
            int columns = maxtrix[0].length;
            int r = 0, c = columns - 1;  //从右上角开始
            while (r < rows - 1 && c >= 0) {
                if (target == maxtrix[r][c]) {
                    return true;
                } else if (target > maxtrix[r][c]) {
                    r++;
                } else {
                    c--;
                }
            }
        }

        return false;
    }

源码链接

后记

  • 摘自《剑指Offter》
  • 牛客网