思路1:暴力法

//全部遍历,进行比较
public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array == null || array.length == 0 || array[0].length == 0)
            return false;

        int len1 = array.length;
        int len2 = array[0].length;
        for(int i = 0; i < len1; i++) {
            for(int j = 0; j < len2; j++){
                    if(array[i][j] == target)
                        return true;
                }
        }   
        return false;
    }
}

思路2:范围缩减

很明显进行区域划分,比如以列为单位,或者以行为单位进行比较,然后压缩范围。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15


 行首个元素是行最小,列最大(截止到自己)。最特殊是左下角元素:行最小,列最大
方式1:从左下角开始。与左下角元素相比,大的时候,说明你不是本列的,因此应该减少列范围。小的时候,说明你不在本行,因此应该减少行范围。反复此过程,不断通过改变左下角的元素,进行查找。比如上面的矩阵中找9
8 9
9 12   找到的其实是粗体标出的9,范围此时压缩成了2*2的矩阵,且9成为左下角元素


 列首个元素是列最小,行最大(截止到自己)。最特殊是右上角元素:行最大,列最小
方式2:从右上角开始。与右上角元素相比,大的时候,说明你不是本行的,因此应该减少行范围。小的时候,说明你不在本列,因此应该减少列范围。反复此过程,不断通过改变右上角的元素,进行查找。比如查7。
4 7
6 8   最后压缩的范围是这样的,而7则成为了右上角的元素。


总结:2种方法,一种是通过右上角来压缩范围,一种是左下角压缩范围。

//左下角的写法
//标志是 要找的比左下角大时,进行的是j++,向array[0].length逼近。也就是当前列++
//array.length 是行数,所以比较过程中,从最大不断减小。
public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array == null || array.length == 0 || array[0].length == 0)
            return false;

        int i = array.length - 1;
        int j = 0;
        while(i >= 0 && j < array[0].length) {
            if(array[i][j] == target)
                return true;
            else if(array[i][j] > target)
                i--;
            else
                j++;
        }
        return false;
    }
}
//右上角范围缩减
public class Solution {
        public static boolean Find(int target, int [][] array) {
        if(array == null || array.length == 0 || array[0].length == 0)
            return false;

        int i = 0;
        int j = array[0].length - 1;
        while(i < array.length && j >= 0) {
            if(array[i][j] == target)
                return true;
            else if(array[i][j] > target)
                j--;
            else
                i++;
        } 
        return false;
    }
}