zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    $P5240 Derivation$
    $P2504 [HAOI2006]聪明的猴子$
    $P1194 买礼物$
    $P2690 接苹果$
    $CF1141C Polycarp Restores Permutation$
    $CF1141B Maximal Continuous Rest$
    $CF1141A Game 23$
    $P1215 [USACO1.4]母亲的牛奶 Mother's Milk$
    $luogu2375[NOI2014]$
    poj 1419 (最大独立集)
  • 原文地址:https://www.cnblogs.com/skillking/p/9688897.html
Copyright © 2011-2022 走看看