//方法一:暴力解法,两层遍历矩阵。时间复杂度为:O(n^m)
//方法二:二分法,两层遍历矩阵。时间复杂度为:O(n*logm)
public class Solution {
    public boolean Find(int target, int [][] array) {
//         //方法一:暴力解法,两层遍历矩阵。时间复杂度为:O(n^m)
//         int length = array.length;//一维数组长度
//         //空数组处理
//         if(length == 0){
//             return false;
//         }
//         int len = array[0].length;//二维数组长度
//         //遍历
//         for(int i=0;i<length;i++){
//             for(int j=0;j<len;j++){
//                 if(array[i][j] == target){
//                     return true;
//                 }
//             }
//         }

//         return false;
        
        //方法二:二分法,两层遍历矩阵。时间复杂度为:O(n*logm)
        int length = array.length;//一维数组长度
        //空数组处理
        if(length == 0){
            return false;
        }
        for(int i=0;i<length;i++){//将每一维数组都使用二分法查找
            if(find(target,array,i)){
                return true;
            }
        }
        
        return false;
    }
    
    public boolean find(int target,int[][] array,int i){
        int len = array[i].length;
        //特殊值处理
        if(len == 0){
            return false;
        }
        int min = 0;//最小值索引
        int max = len-1;//最大值索引
        int mid = (min+max)/2;//中值索引
        while(min<=max){//循环结束条件
            if(array[i][mid] == target){//找到目标值
                return true;
            }else if(array[i][mid] > target){//中值大于目标值,目标值在左区间
                max = mid - 1;//更新最大值
            }else{//中值小于目标值,目标值在右区间
                min = mid + 1;//更新最小值
            }
            mid = (min+max)/2;//更新中值
        }
        if(min>max){//判断退出while循环的方式,一是return终止循环,二是条件不满足是退出循环
            return false;
        }
        
        return true;//没有意义的返回值
    }
}