class Solution {
public:

    // 看题意似乎是正方形 no  可能是矩形 而且可能有重复元素!
    /**
     * 二分搜索 基本函数
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int binary_search(vector<int>& nums, int target) {
        // write code here

        int n = nums.size();
        int l = 0, r = n-1;
        int ans = -1;
        while (l<=r) // 终止条件注意!
        {
            int m = l+0.5*(r-l); //  0.5*(r+l) 注意这两个取中值都可以 不要混淆就行!

            if(nums[m]>target)
            {
                r = m - 1;
            }
            else if(nums[m]<target)
            {
                l = m+1;
            
            }
            else // 一定得保留此支路!
            {
                ans = m;
                break;
            }
        
        }

        return ans>=0 ? ans : -1;
    }

    // 解法三 线性搜索 利用每一行/列 递增的性质 达到进阶要求 O(m+n) !
    bool Find(int target, vector<vector<int> > array) {

        int m = array.size(), n = array[0].size();

        bool ans = false;

        int up = 0, right = n-1;

        while(up<m && right>=0) // 从右上开始   答案是从左下开始 同理都可以
        { // 注意终止条件 就是碰到某面墙 到最下面 或最左侧
            if(array[up][right] == target)
            {
                return true;
            }

            if(array[up][right]>target)
            {
                right--;
            }
            else
            {
                up++;
            }
        }

    
        

        return ans;
        
    } 
};