剑指Offer题解

二维数组中的查找

2018-07-05  本文已影响9人  lvlvforever

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15

最容易想到的就是暴力算法,两层循环依次比较,时间复杂度O(n)。
结合题中给的条件,每一行和每一列是递增有序,我们考虑二分查找和分治算法的思想,通过逐渐缩小范围来降低时间复杂度。
这里注意一下如果我们从左上角开始查找,那么很难去掉部分区域,导致很复杂,如果我们从右上角开始查找,那么每一次比较都可以去掉一部分区域,从而减少问题的规模。
举个例子,查找7,首先和右上角的9比较,7<9,所以需要在前三列查找,这样问题规模就缩小了;然后和8比较,
7<8,所以需要在前两列查找;继续和2比较,7>2,所以需要在前两列中的后三行查找,继续和4比较....直到找到7或者数组越界查找失败。
代码仅供参考。

 public boolean Find(int target, int [][] array) {
         if (array == null || array.length < 1) {
            return false;
          }
        int rows = array.length-1;
        int cols = array[0].length-1;
        int i = 0, j = cols;
        while ( i <= rows && j >= 0 ) {
            int ele = array[i][j];
            if (ele == target) {
                return true;
            } else if (ele < target) {
                i++;
            }else{
                j--;
            }
        }
        return false;
    }
上一篇 下一篇

猜你喜欢

热点阅读