⭐算法入门⭐《坐标转换》中等01 —— LeetCode 74. 搜索二维矩阵
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《坐标转换》中等01 —— LeetCode 74. 搜索二维矩阵相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
还不会C语言,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?上简单题! 🧡《C语言入门100例》🧡
LeetCode 太简单?大神盘他! 🌌《夜深人静写算法》🌌
一、题目
1、题目描述
编写一个高效的算法来判断 m × n m \\times n m×n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
1)每行中的整数从左到右按升序排列。
2)每行的第一个整数大于前一行的最后一个整数。
样例输入: m a t r i x = [ [ 1 , 2 , 3 , 4 ] , [ 5 , 6 , 8 , 9 ] , [ 16 , 19 , 27 , 99 ] ] , t a r g e t = 3 matrix = [[1,2,3,4],[5,6,8,9],[16,19,27,99]], target = 3 matrix=[[1,2,3,4],[5,6,8,9],[16,19,27,99]],target=3
样例输出: true
2、基础框架
- c++ 版本给出的基础框架代码如下:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
}
};
- 输入数组参数类型是
vector<vector<int>>&
,代表的是一个引用类型的二维数组,按照题目要求,需要返回一个这个二维数组中是否存在 t a r g e t target target 这个值;
3、原题链接
二、解题报告
1、思路分析
- 首先,我们来看个图:
- 对于这个特殊的二维数组,我们可以将它转换成一个有序的一维数组,然后就可以在一维数组上做二分查找了。
- 对于一个 n × m n \\times m n×m 的矩阵,我们可以从左往右,从上往下进行编号,令一维编号为 i i i,二维编号的行为 r r r,列为 c c c,于是就有 r r r 和 c c c 关于 i i i 的表达式如下:
- r = ⌊ i m ⌋ c = i m o d m r = \\lfloor \\frac i m \\rfloor \\\\ c = i \\ mod \\ m r=⌊mi⌋c=i mod m
- 于是只要二分枚举 i i i,就能对应找到矩阵里的值,然后和目标值进行大小判定,从而调整迭代 i i i 的值,就像一维的二分枚举一样。
2、时间复杂度
- 查找的时间复杂度为 O ( l o g 2 n + l o g 2 m ) O(log_2n + log_2m) O(log2n+log2m)。
3、代码详解
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int n = matrix.size(); // (1)
int m = matrix[0].size(); // (2)
int l = 0, r = n * m - 1; // (3)
while(l <= r) {
int mid = (l + r) >> 1; // (4)
int row = mid / m; // (5)
int col = mid % m;
if(matrix[row][col] == target) {
return true;
}else if(target > matrix[row][col]) {
l = mid + 1;
}else {
r = mid - 1;
}
}
return false;
}
};
- ( 1 ) (1) (1) 获取矩阵的行 n n n;
- ( 2 ) (2) (2) 获取矩阵的列 m m m;
- ( 3 ) (3) (3) 定义一维数组下标的范围是 [ 0 , n m ) [0, nm) [0,nm);
- ( 4 ) (4) (4) 二分枚举的是一维数组的下标;
- ( 5 ) (5) (5) 将一维数组的下标转换成二维数组的下标,然后去二维数组进行索引获得值进行二分判定;
- 关于二分查找的内容,可以参考这个题:《二分枚举》简单01 —— LeetCode 704. 二分查找。
三、本题小知识
可以用 除法 和 取模 来实现两个分量的坐标转换。
以上是关于⭐算法入门⭐《坐标转换》中等01 —— LeetCode 74. 搜索二维矩阵的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《坐标转换》简单01 —— LeetCode 566. 重塑矩阵
⭐算法入门⭐《二分枚举》中等01 —— LeetCode 面试题 16.21. 交换和
⭐算法入门⭐《哈希表》中等01 —— LeetCode 525. 连续数组
⭐算法入门⭐《二叉树 - 二叉搜索树》中等04 —— LeetCode 538. 把二叉搜索树转换为累加树