由于矩阵的递增递减特性决定了高效的查找的起点和剪枝是解题关键。

要选择那种是所在行/列的最大的,同时是所在列/行最小的点开始查找,这样的点,当查找的目标值比它小时,能够排除一整列/行,当目标值比它大时,同样能排除一行/列,从而提升查找的效率。

public class Solution {
    public boolean Find(int k, int [][] a) {
        if (a == null || a.length == 0 || a[0].length == 0)  // 非法的矩阵: null, {}, {{}, {}, {}}等
            return false;
        int m = a.length, n = a[0].length, i = 0, j = n - 1; // m行n列,从右上角开始
        while (i <= m - 1 && j >= 0) {
            if (a[i][j] == k) return true;
            else if (a[i][j] < k) i++;
            else j--;
        }
        return false;
    }
}