public class searchMatrix {
    //方法一:确定行号,进行二分查找
    public static boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length;
        int n = matrix[0].length;
        if(target<matrix[0][0]||target>matrix[m-1][n-1]||m==0){
            return false;
        }
        int low = 0;
        int high = matrix[0].length-1;
        for (int i = 0; i <m ; i++) {
            if(target>=matrix[i][0]&&target<=matrix[i][n-1]){
                //那么就当前一行找
                while (low<=high){
                    int mid = (low+high)/2;
                    if(matrix[i][mid]<target){
                        low = mid+1;//取右半部分
                    }else if (matrix[i][mid]>target){
                        high = mid -1;
                    }else {
                        return true;
                    }
                }
                break;
            }
        }
        return false;
    }
    //方法二:二维转一维
    public static boolean searchMatrix2(int[][] matrix, int target) {
        //先定义m和n
        int m  = matrix.length;
        if(m==0) return false;
        int n = matrix[0].length;

        //二分查找,定义左右指针
        int left = 0;
        int right = m*n-1;

        while (left<=right){
            //计算中间位置
            int mid = (left+right)/2;
            //计算二位数组中对应的行列号,取出对应元素
            int midElement = matrix[mid/n][mid%n];

            //判断中间元素与target大小关系
            if(midElement<target){
                left = mid+1;
            }else if(midElement>target){
                right = mid-1;
            }else {
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        int[][] arr ={
            {1,3,5,7},
            {10,11,16,20},
            {23,30,34,60}
        };
        int target = 34;
        boolean flag = searchMatrix2(arr,target);
        System.out.println(flag);
    }
}