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;
        }
  • 相关阅读:
    大数据量下的SQL Server数据库自身优化
    NodeJS 学习笔记
    SOA、ESB、NServiceBus、云计算 总结
    .NET及.NET Core系统架构
    TCP/IP协议、HTTP协议、SOCKET通讯详解
    web压测工具http_load
    前端面试问题答案汇总--通识篇
    前端面试问题答案汇总--高级篇
    前端面试问题答案汇总--进阶篇
    前端面试问题答案汇总--基础版
  • 原文地址:https://www.cnblogs.com/skillking/p/9688897.html
Copyright © 2011-2022 走看看