博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
74. Search a 2D Matrix
阅读量:6820 次
发布时间:2019-06-26

本文共 1973 字,大约阅读时间需要 6 分钟。

一、题目

  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;    }

 

转载于:https://www.cnblogs.com/skillking/p/9688897.html

你可能感兴趣的文章
拿Nginx 部署你的静态网页
查看>>
23种设计模式
查看>>
制作自己的镜像(一)
查看>>
openstack命令整理
查看>>
服务Recipes
查看>>
mysql理解与基本用户管理
查看>>
解读电商平台10大促销活动类型
查看>>
Linux基本优化指南
查看>>
静态代理
查看>>
控件WebView显示网页
查看>>
Linux Mint下Spyder使用Python3
查看>>
MySQL数据库管理工具
查看>>
JP-Word简谱编辑 V4.35官方正式版
查看>>
Javascript面试题
查看>>
据说是iOS开发一年总结的笔记,有空看看
查看>>
修改 ubuntu 默认启动项
查看>>
Java递归删除目录中的子目录和文件的方法
查看>>
Android startActivity 隐式调用, 启动其他Activity过程
查看>>
webSocket 入门demo
查看>>
输入框样式定义学习笔记
查看>>