【LeetCode题解】LeetCode 74. 搜索二维矩阵
【题目链接】
74. 搜索二维矩阵
【题目描述】
【题解】
方法一:转换为一维数组
根据题目要求,“每行中的整数从左到右按非严格递增顺序排列,每行的第一个整数大于前一行的最后一个整数”,我们可以通过将二维矩阵按照行优先的顺序遍历并拼接为一维数组来解决这个问题。
转换后得到的一维数组将是一个严格单调递增的序列,符合使用二分查找的条件。由于数组已经按严格递增的顺序排列,因此可以直接套用经典的二分查找模板进行查找。
【AC代码】
class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int row = matrix.size();vector<int> nums;for(int i = 0; i < row; i++) {int col = matrix[i].size();for(int j = 0; j < col; j++)nums.push_back(matrix[i][j]);}int l = 0, r = nums.size() - 1;while(l < r) {int mid = (l + r) / 2;if(nums[mid] >= target)r = mid;elsel = mid + 1;}if(nums[l] == target)return true;return false;}
};
方法二:一次二分查找
在方法一中,我们通过将二维矩阵转换为一维数组来应用二分查找,这虽然能有效地解决问题,但在实现时需要额外的空间来存储一维数组。实际上,我们可以通过一次二分查找来直接在原矩阵上进行查找,避免额外的空间开销,并且保持二分查找的高效性。
通过观察题目要求:“每行中的整数从左到右按非严格递增顺序排列,每行的第一个整数大于前一行的最后一个整数”,我们可以将二维矩阵视为一个升序数组。具体地,矩阵的每一行拼接在一起就会得到一个严格递增的数组。因此,我们可以在这个虚拟的升序数组中使用二分查找来找到目标元素。
通过将矩阵的索引映射到一维数组的下标,并在该虚拟的升序数组上进行二分查找。对于二维矩阵中的任意下标(i, j)
,可以将其转换为一维数组的下标k
,其关系为:k = i * col + j
,其中col
为矩阵的列数。反过来,如果知道一维数组中的下标k
,我们通过以下公式计算出对应的二维矩阵的行和列:i = k / col
(行索引),j = k % col
(列索引)
【AC代码】
class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int row = matrix.size(), col = matrix[0].size();int l = 0, r = row * col - 1;while(l < r) {int mid = l + r >> 1;int val = matrix[mid / col][mid % col];if(val >= target)r = mid;elsel = mid + 1;}return matrix[l / col][l % col] == target;}
};