第三十五题
暴力的遍历 就不写了
动态规划 每走一步 都淘汰了一部分数组内容 如果下一步超出了数组的范围 返回false
class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array[0].size()==0)
            return false;
        // 暴力 遍历二位数组 逐个比对,超过要求的时间复杂度
        
        // 因为本来就是有序的 可以直接找 动态规划 每走一步 该点的左上角的矩阵 全都不符合要求
        int hang=array.size();
        int lie=array[0].size();
        
        // 从左下角开始
        int l=0,h=hang-1;
        // 每一个数字永远是他所在的左上角的矩阵中的最大值、
        // 那么只要是说 当前数字大于该点,则该点的左上角的矩阵都不符合要求 应该向右走
        // 如果说 该点 小了,那么所在的答案应该在该点向上一行的右上角
        
        // 用给的例子1289来说
        // 初始位置在最左下角6,如果数字是9
        // 9>6 那么6这一列 就都不可能是结果了
        // 向右走到8 同理 包含8的左上角的矩阵都不可能
        // 到11 大于9了,这说明 11右边的数字不可能是结果了,结果应该在11右上角的矩阵中 8 9/ 9 12/10 13 当中
        // 向上走到10 同理 只可能在10的右上角的矩阵中 8 9/9 12
        // 到了9,匹配正确,返回true
        
        // 假设不是9,答案是8.5
        // 8.5<9 向上 只可能在8 9中
        // 8.5>8 向右 只可能在9中
        // 8.5<9 向上 超出了数组的界限 所以返回false
        
        // 退出循环条件
        // 如果说 列超过了总共的列数,行小于0
        // 就说明不在二维数组中
        while(l<lie && h>=0){
            int num=array[h][l];
            // 如果相等 返回结果
            if(num == target)
                return true;
            // 不相等 要么太大 要么太小
            // 如果目标数字大于当前的数字 则向右走
            else if(num < target)
                l++;
            // 如果目标数字小于当前的数字 则向左走
            else if(num>target)
                h--;
        }
        return false;
    }
};