[Leetcode] search a 2d matrix 搜索二维矩阵
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
Given target =3, returntrue.
题意:在一个二维矩阵中,查询一个数是否存在。数组:1)每行从左到右从下到大排好;2)行首元素大于上一行的最后一个元素;
思路:常规思路:先遍历行找到元素所可能在的行,然后遍历列,判断是否在在该行中,时间复杂度O(n+m);二分查找版本一:是对常规思路的升级,先查找行 ,再查找列,但这时使用的查找的方法不是从头到尾的遍历,是二分查找,值得注意的是查找完行以后的返回值,时间复杂度O{logn+logm);二分查找版本二:因为矩阵数排列的特性,可以看成一个排列好的一维数组[0, n*m],可以针对整个二维矩阵进行二分查找,时间复杂还是O(log(n*m)),这里的难点是,如何将二维数组的下标和一维数组之间进行转换。
方法一:
class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target)
{
int row = matrix.size();
int col = matrix[].size();
int subRow = ;
if (row == || col == ) return false;
//寻找行
if (matrix[row - ][] <= target) //最后一行,特殊处理
subRow = row - ;
else
{
for (int i = ; i<row - ; ++i)
{
if ((matrix[i][] <= target) && (matrix[i + ][]>target))
{
subRow = i;
break;
}
}
}
//查找列
for (int j = ; j<col; ++j)
{
if (matrix[subRow][j] == target)
return true;
}
return false;
}
};
方法二:如下:
// Two binary search
class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target)
{
int row=matrix.size();
int col=matrix[].size();
if (row== || col==) return false;
if (target < matrix[][] || target > matrix[row-][col-]) return false; //查找行
int lo = , hi = row - ;
while (lo <= hi)
{
int mid = (lo+hi) / ;
if (matrix[mid][] == target)
return true;
else if (matrix[mid][] < target)
lo = mid + ;
else
hi = mid - ;
}
int tmp = hi; //特别注意
//查找该行
lo = ;
hi = col - ;
while (lo <= hi)
{
int mid = (lo+hi) / ;
if (matrix[tmp][mid] == target)
return true;
else if (matrix[tmp][mid] < target)
lo = mid + ;
else
hi = mid - ;
}
return false;
}
};
方法三:
class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target)
{
int row = matrix.size();
int col = matrix[].size();
if(row==||col==) return false;
if(matrix[][]>target||target>matrix[row-][col-]) return false; //加与不加都行
int lo=,hi=row*col-;
while(lo<=hi)
{
int mid=(lo+hi)/;
int i=mid/col;
int j=mid%col;
if(target==matrix[i][j])
return true;
else if(target>matrix[i][j])
lo=mid+;
else
hi=mid-;
}
return false;
}
};
[Leetcode] search a 2d matrix 搜索二维矩阵的更多相关文章
- leetCode 74.Search a 2D Matrix(搜索二维矩阵) 解题思路和方法
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- 074 Search a 2D Matrix 搜索二维矩阵
编写一个高效的算法来搜索 m x n 矩阵中的一个目标值.该矩阵具有以下特性: 每行中的整数从左到右排序. 每行的第一个整数大于前一行的最后一个整数.例如,以下矩阵:[ [1, 3, ...
- Leetcode74. Search a 2D Matrix搜索二维矩阵
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: matrix ...
- Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II)
Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II) 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵 ...
- [LeetCode] Search a 2D Matrix 搜索一个二维矩阵
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- LeetCode(74):搜索二维矩阵
Medium! 题目描述: 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 ...
- search a 2D matrix(在二维数组中搜索一个元素)
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- LeetCode OJ:Search a 2D Matrix(二维数组查找)
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- [LeetCode] Search a 2D Matrix II 搜索一个二维矩阵之二
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
随机推荐
- Spring笔记2
Bean生命周期 1 实例化 2 注入属性 3 BeanNameAware 4 BeanFactoryAware 5 ApplicationContextAware 6 BeanPostProcess ...
- 【php】php 生僻知识点认知
资料引用来源:http://www.runoob.com/php/php-tutorial.html 表单提交中, 变量名中的点和空格被转换成下划线.例如 <input name=" ...
- hadoop生态搭建(3节点)-04.hadoop配置
如果之前没有安装jdk和zookeeper,安装了的请直接跳过 # https://www.oracle.com/technetwork/java/javase/downloads/java-arch ...
- HDSF读写文件
HDFS 读取文件 HDFS的文件读取原理,主要包括以下几个步骤: 1.首先调用FileSystem对象的open方法,其实获取的是一个DistributedFileSystem的 实例. 2.D ...
- 软件的按契约设计(DbC---Design by Contract)
一.DbC基本概念 DbC的思想源于商业活动中商家和用户的行为(义务和利益关系),双方都要遵守一个契约(合同),交易才能完成. 商家与用户的契约关系如下: 1. 商家必须提供某种产品(义务),并有权获 ...
- Linux编译移植Qt5的环境_OMAPL138平台
Linux编译移植Qt5_OMAPL138 [导语]:昨天编译Qt5各种失败,各种离奇的错误在Google上面也搜索不到,真是让人"蛋疼菊紧",今天把所有的环境全部清理干净,也重新 ...
- Flask初学者:url_for
URL反转:反转是指通过视图函数名称得到其对应的URL(有反转也就有正转,即通过URL得到视图函数返回的内容,也就是我们平时的访问网页了),需要“url_for(endpoint, **values) ...
- python3爬虫之开篇
写在前面的话: 折腾爬虫也有一段时间了,从一开始的懵懵懂懂,到现在的有一定基础,对于这一路的跌跌撞撞,个人觉得应该留下一些文字性的东西,毕竟好记性不如烂笔头,而且毕竟这是吃饭的家伙,必须用心对待才可以 ...
- PHP json_decode返回null解析失败原因
在PHP5.4之前 json_decode函数有两个参数json_decode有两个参数,第一个是待解析的字符串,第二个是是否解析为Array json_decode要求的字符串比较严格:(1)使用U ...
- R语言学习笔记(十五):获取文件和目录信息
file.info() 参数是表示文件名称的字符串向量,函数会给出每个文件的大小.创建时间.是否为目录等信息. > file.info("z.txt") size isdir ...