74. Search a 2D Matrix

一、题目

  1、审题

  

  2、分析

    一个二维数组,其中从左到右为升序,且下面一行数值均比上面的大,求所给数值 target 是否存在于数组中。

二、解答

  1、思路:

    方法一、

      先对二维数组的每一行的第一列进行二分查找,在对该列所在的行进行二分查找。

public boolean searchMatrix(int[][] matrix, int target) {
    
        int rows = matrix.length - 1;
        if(rows < 0)    // 处理空行
            return false;
        
        int cols = matrix[0].length - 1;
        if(cols < 0)    // 处理空列
            return false;
        
        int left = 0;
        int right = rows;
        // 确定行为 right
        while(left <= right) {
            int mid = (left + right) / 2;
            if(matrix[mid][0] > target)
                right = mid - 1;
            else 
                left = mid + 1;
        }

        // 处理特殊情况,eg 只有一行、每行只有一列
        if(right < 0)
            return false;
        if(cols == 0)
            return target == matrix[right][0];
        
        int rowIndex = right;
        right = cols;
        left = 0;
        while(left <= right) {
            int mid = (left + right) / 2;
            if(matrix[rowIndex][mid] > target)
                right = mid - 1;
            else 
                left = mid + 1;
        }
        
        return matrix[rowIndex][right] == target;
        
    }

    方法二、

      将二维数组看成一个有序的一维数组进行一次二分法计算。

      其中坐标为: [mid/col][mid%col]

public boolean searchMatrix2(int[][] matrix, int target) {
        
        int rows = matrix.length;
        int cols = matrix[0].length;
        
        int left = 0; 
        int right = rows * cols - 1;
        while(left <= right) {
            int mid = (left + right) / 2;
            int midValue = matrix[mid / cols][mid % cols];
            
            if(midValue < target)
                left = mid + 1;
            else if(midValue > target)
                right = mid - 1;
            else 
                return true;    // 唯一 找到
        }
        
        // 不需要这样写,而且也会报错,当只有一行一列时。
//        return matrix[right / cols][right % cols] == target;
        return false;
    }

 

posted @ 2018-09-21 22:51  skillking2  阅读(95)  评论(0编辑  收藏  举报