3.二维数组中的查找 ----《剑指Offer》题解(Java)

题目

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

样例
输入数组:

[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]

如果输入查找数值为7,则返回true,

如果输入查找数值为5,则返回false。

算法思路

常规思路是直接两层循环暴搜,但时间复杂度是O(n^2)。
本题可以利用从左到右,从上到下递增的性质,从右上角的元素开始(从左下角也行),如果target比该元素小,那么该元素所在列不必再做判断(整列都比该元素大),如果taget比该元素大,则不用再判断该元素所在行的其他元素,也就是每次都能省去判断整一列或者一行,缩小搜索区域。
时间复杂度是:O(n+m),其中n是行数,m是列数

代码实现

class Solution {
    public boolean searchArray(int[][] array, int target) {
        if(array == null || array.length == 0) {
            return false;
        }
        
        if(array[0] == null || array[0].length == 0) {
            return false;
        }
        
        int row = array.length, col = array[0].length;
        int rIdx = 0, cIdx = col - 1;
        while(rIdx < row && cIdx >= 0) {
            int num = array[rIdx][cIdx];
            if(num == target) return true;
            if(num > target) cIdx--;
            else rIdx++;
        }
        return false;
    }
}
posted @ 2019-07-01 17:17  TatuCz  阅读(140)  评论(0编辑  收藏  举报