剑指offer(一) 二维数组的查找

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 
 第一种方法,在每一行进行二分查找,NlogN。
第二种方法,也可能是最好的,因为已经是有序的,我们选取左下角或者右上角,每次进行判断大小,选择上移或者右移,这样每次都有贪心选择,但是这样的时间复杂度怎么确定呢?
 
特别注意边界的判断!否则空指针异常。获得传进来的数组和获得下标之间尤其要判断。
 
class Solution {
    public boolean Find(int target, int [][] array) {
        if(array.length == 0 ) return false;
        //从左下角开始
        int r = array.length - 1;
        int l = 0;
        while(true) {
            if(r<0 || l>array[0].length-1) return false;

            if(array[r][l] > target) {
                r--;
            }else if(array[r][l] < target) {
                l++;
            }else {
                return true;
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        int a = 16;
        int[][] array = {};
        Solution so = new Solution();
        System.out.println(so.Find(16,array));

    }
}
class Solution {
    public boolean Find(int target, int [][] array) {

        for(int i = 0; i < array.length; i++) {
            int l = 0;
            if(array.length<=0) return false;
            if(array[0].length<=0) return false;

            int r = array[0].length-1;
            while(l<=r) {
                int mid = (l+r)/2;
                if(target>array[i][mid]) {
                    l = mid+1;
                }
                else if(target<array[i][mid]) {
                    r = mid-1;
                }
                else
                    return true;
            }
        }
        return false;

    }
}

public class Main {
    public static void main(String[] args) {
        int a = 16;
        int[][] array = {{1,3,4},{3,16,1}};
        Solution so = new Solution();
        System.out.println(so.Find(16,array));

    }
}

 

posted @ 2017-11-05 21:50  Lawliet__zmz  阅读(173)  评论(0编辑  收藏  举报