Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)
1.问题描述
写一个高效的算法,从一个 m×n m\times n的整数矩阵中查找出给定的值,矩阵具有如下特点:
每一行从左到右递增。
每一列从上到下递增。
2. 方法与思路
2.1 二分查找法
根据矩阵的特征很容易想到二分法,但是这是一个二维的矩阵,如何将问题转化为一维是关键。实际上我们可以根据矩阵的第一列确定值可能所在的行的范围 (limu,limd) (limu,limd),其中limu=0,使得 matrix[0][0]≤matrix[i][0]≤matrix[limd][0] matrix[0][0] \le matrix[i][0] \le matrix[limd][0], i∈[0,limd] i \in [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 11 > 5,又缩减一列。数字7同样小于5,在缩减一列,那么现在的矩阵变为:
[1, 4,]
[2, 5]
[3, 6]
[10, 13]
[18, 21]
判断数字4时,由于 5>4 5 > 4,目标值肯定不在4所在的行,去点这一行,在进行判断。
[2, 5]
[3, 6]
[10, 13]
[18, 21]
Okay,判断数字5,找到目标值返回。
这种算法时间复杂度 O(n) 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
LeetCode 240. Search a 2D Matrix II Solution1: 为什么把第74题的代码改都不用改的拿过来就可以AC,一脸懵逼啊... class Solution { p ...
- [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 f ...
- leetcode 240. Search a 2D Matrix II | 240. 搜索二维矩阵 II(Java)
题目 https://leetcode.com/problems/search-a-2d-matrix-ii/ 题解 方法1 思路类似于 leetcode 200. Number of Islands ...
- LeetCode 74. Search a 2D Matrix
LeetCode 74. Search a 2D Matrix Solution1:我的答案 <剑指offer>原题 class Solution { public:bool search ...
- 二分法和分治法概念区别--记录
1.二分法和分治法的概念区别: 二分搜索每次都要舍弃一半,从留下的一半中寻找目标:而分治法把一个大问题分成两个或多个小问题,递归地求这些小问题的解,最后再把它们小心谨慎的合并起来,并且要仔细考虑合并时 ...
- LeetCode Search a 2D Matrix II
问题:给出一个二维数组,其行,列是递增的,和一个要查找的数,问矩阵中是否有要查找的数 思路: 第一种方法是直接暴力查找,在二维数组中查找. 第二种方法是基于对角线上,在行,列上作二分查找 第三种方法递 ...
- 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 ...
- [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 f ...
- 二维数组查找(C++)(二分查找)
题目描述 已知int一个有序矩阵mat,同时给定矩阵的大小n和m以及需要查找的元素x,且矩阵的行和列都是从小到大有序的.设计查找算法返回所查找元素的二元数组,代表该元素的行号和列号(均从零开始).保证 ...
最新文章
- 计算机科学领域最高荣誉,骄傲!这位毕业于嘉兴一中的数学家,荣获华人数学领域的最高荣誉...
- checkbox的全选中,取消全选中
- Codeforces 1103
- C++/CLI Winform中调用DLL的三种方法
- c++异常的层次结构(继承在异常中的应用)
- 为什么Internet选择分组交换而不是电路交换_交换机和路由器的区别有哪些?
- 浅谈StringBuilder
- 什么是 Unix 以及它为什么这么重要?
- 深入理解Java String 池概念(String pool concept)
- 在visual studio2015中使用easyX画图
- BGP联邦原理及配置实例
- 构建之法 前三章读后感
- Mysql分页查询出现重复数据
- 西部数码网站备案幕布及核验单填写规范
- Medusa 破解centos密码
- OSChina 周二乱弹 ——有一天你当了程序员巴巴
- 集合长度可变的实现原理(解析为什么集合长度可变)
- 视觉SLAM(二):相机与图像
- 使用Cydia能干什么
- 动态代理:1 个经纪人如何代理 N 个明星