Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)
1.问题描写叙述
写一个高效的算法。从一个m×n的整数矩阵中查找出给定的值,矩阵具有例如以下特点:
每一行从左到右递增。
每一列从上到下递增。
2. 方法与思路
2.1 二分查找法
依据矩阵的特征非常easy想到二分法,可是这是一个二维的矩阵,怎样将问题转化为一维是关键。实际上我们能够依据矩阵的第一列确定值可能所在的行的范围(limu,limd),当中limu=0,使得matrix[0][0]≤matrix[i][0]≤matrix[limd][0],i∈[0,limd]。
而确定limd的值能够使用二分法。
确定了值可能在的行的范围后。逐行在进行二分查找目标值。这样就将问题降到一维上来了。代码例如以下:
class Solution {
public:
bool searchMatrix(vector<vector<int> >& matrix, int target) {
if(matrix.size() == 0) return false;
int i,j,mid,rows = matrix.size(),cols = matrix[0].size();
int limd = rows-1,limu = 0;
/*二分查找目标值可能所在行的下限*/
while(limu < limd)
{
mid = (limu + limd)/2;
if(matrix[mid][0] > target) limd = mid - 1;
else if(matrix[mid][0] < target) limu = mid +1;
else return true;
}
/*对每一行进行二分查找*/
for(i = 0; i <= limd; i++)
{
int l = 0, r = cols-1;
while(l <= r)
{
mid = (l + r)/2;
if(matrix[i][mid] < target) l = mid+1;
else if(matrix[i][mid] > target) r = mid - 1;
else return true;
}
}
return false;
}
};
2.2 分治法
另一种方法就是採用分值的思想。以题目给出矩阵为例,查找数字5。细致观察矩阵,最右上角的数字为15,因为矩阵是列递增,所以数字5不可能在最右側15这一列,我们便可将这一列不予考虑,将范围缩减了一列。
[1, 4, 7, 11]
[2, 5, 8, 12]
[3, 6, 9, 16]
[10, 13, 14, 17]
[18, 21, 23, 26]
再推断数字11。相同11>5,又缩减一列。数字7相同小于5,在缩减一列。那么如今的矩阵变为:
[1, 4,]
[2, 5]
[3, 6]
[10, 13]
[18, 21]
推断数字4时,因为5>4,目标值肯定不在4所在的行,去点这一行,在进行推断。
[2, 5]
[3, 6]
[10, 13]
[18, 21]
Okay,推断数字5,找到目标值返回。
这样的算法时间复杂度O(n),要优于第一种算法。代买例如以下:
class Solution {
public:
bool searchMatrix(vector<vector<int> >& matrix, int target) {
if(matrix.size() == 0) return false;
int i,j,rows = matrix.size(),cols = matrix[0].size();
i = 0;
j = cols-1;
while(i < rows && j >= 0)
{
if(matrix[i][j] == target) return true;
else if(matrix[i][j] > target) j--;
else i++;
}
return false;
}
};
Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)的更多相关文章
- [LeetCode] 240. Search a 2D Matrix II 搜索一个二维矩阵 II
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- (medium)LeetCode 240.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 ...
- Leetcode 240. 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 ...
- leetcode 74. Search a 2D Matrix 、240. Search a 2D Matrix II
74. Search a 2D Matrix 整个二维数组是有序排列的,可以把这个想象成一个有序的一维数组,然后用二分找中间值就好了. 这个时候需要将全部的长度转换为相应的坐标,/col获得x坐标,% ...
- 【LeetCode】240. Search a 2D Matrix II
Search a 2D Matrix II Write an efficient algorithm that searches for a value in an m x n matrix. Thi ...
- 【刷题-LeetCode】240. Search a 2D Matrix II
Search a 2D Matrix II Write an efficient algorithm that searches for a value in an m x n matrix. Thi ...
- 【LeetCode】240. Search a 2D Matrix II 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- [LeetCode] 74 Search a 2D Matrix(二分查找)
二分查找 1.二分查找的时间复杂度分析: 二分查找每次排除掉一半不合适的值,所以对于n个元素的情况来说: 一次二分剩下:n/2 两次:n/4 m次:n/(2^m) 最坏情况是排除到最后一个值之后得到结 ...
- 【leetcode】74. Search a 2D Matrix & 240. Search a 2D Matrix II
题目如下:这两个题目可以用同样的代码来解答,因此就合并在一起了. 题目一: 题目二: 解题思路:两个题目的唯一区别在于第二个题目下一行的最小值不一定会小于前一行的最大值.但是不管怎么样我们可以确定的是 ...
随机推荐
- 利用Linux的Samba服务模拟NT域
利用Linux的Samba服务模拟NT域 Samba是一个与Windows NT具有相同协议的软件包.我们可以利用Samba服务来模拟 Windows NT域,使用户从Windows计算机上直接使用一 ...
- The "Out of socket memory" error
The "Out of socket memory" error I recently did some work on some of our frontend machines ...
- Maven 搭建spring boot多模块项目(附源码),亲测可以,感谢原创
原创地址:https://segmentfault.com/a/1190000005020589 我的DEMO码云地址,持续添加新功能: https://gitee.com/itbase/Spring ...
- 聊一聊Spring中的线程安全性
Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”.但其实,Spring并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码. Spring对每个bean提 ...
- 第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)
brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们 ...
- 关于微软C#中的CHART图表控件的简单使用【转】
最近公司项目要用到Chart图表控件,这是一个比较老的东西了,目前网络上似乎已经不太流行这个控件,但是只要配置了相关的属性,效果还是可以的.前前后后摸索了好久,接下来谈谈这个件控件最重要的几个属性. ...
- json字符串转JSONObject和JSONArray以及取值
import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class JsonTest { public static v ...
- 微信小程序显示html格式内容(wxParse使用及循环解析数据渲染)
小程序默认是不支持html格式的内容显示的,那我们需要显示html内容的时候,就可以通过wxParse来实现. 首先我们下载wxParse,github地址:https://github.com/ic ...
- MYSQL数据删除数据,物理空间没释放
当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已 ...
- 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)
http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) z ...