剑指offer01

126 阅读1分钟

题目描述

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

解题思路分析

从本题题干给出的“每一行从左至右递增,每一列从上到下递增”这个信息,我们就应该嗅到解题的关键就在这里,其实一个最简单的解题方法就是暴力法,循环遍历一遍一定可以得到正确的答案,但是考虑到时间复杂度(O(mn) m,n分别为行列的长度),这样解肯定是不行,这也不是这个题目考察的目的,所以这里我们就需要从上面我们提到的那个题干条件入手,找到能够降低时间复杂度的方法。
思考之后我们可以发现,如果我们开始从数组的右肩那个数开始比较,这个问题就找到一个更好方法了,就是从一开始先从右肩那个数进行比较,如果那个数大于我们所要找的数的话,就应该行数不变,列数-1,如果小于我们要找的数,就应该行数+1,这样循环下去,如果数组存在目标整数的话,就一定能找到。

题目源代码

private static boolean find(int target, int[][] array) {
        if (array == null) {
            return false;
        }
        int row = array.length, col = array[0].length;
        int i = 0, j = col - 1;
        while (i < row && j >= 0) {
            if (array[i][j] == target) {
                return true;
            } else if (array[i][j] < target) {
                i++;
            } else {
                j--;
            }
        }
        return false;
    }