LeetCode 面试经典 150_二分查找_搜索二维矩阵(112_74_C++_中等)
题目描述:
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
输入输出样例:
示例 1:

输入 :matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:

输入 :matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
m== matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
题解:
解题思路:
思路一(一次二分查找(将二维转换为一维)):
1、将二维数组看作是一维数组进行处理(运用 "/" 和 "%" 映射到一维)。
例:

按照一维 数组空间展开为:[1,3,5,7,10,11,16,20,23,30,34,60]
一维 :中间元素取11,其下标为 5
二维 :中间元素取11,其下标为 [1,1]
5/3(column_size)=1(行)
5%4(column_size)=1(列)
一维和二维的对应关系为:
一维元素的下标 / 矩阵列数 = 二维元素的行下标
一维元素的下标 % 矩阵列数 = 二维元素的列下标
2、复杂度分析:
① 时间复杂度:O(logmn),其中m和n分别是矩阵的行数和列数。
② 空间复杂度:O(1)。
代码实现
代码实现(思路一(一次二分查找(将二维转换为一维))):
cpp
class Solution {
public:
// 函数名称:searchMatrix
// 输入参数:一个二维矩阵matrix和一个整数target
// 返回值:如果target在矩阵中,则返回true;否则返回false
bool searchMatrix(vector<vector<int>>& matrix, int target) {
// 获取矩阵的列数
int col_size = matrix[0].size();
// 获取矩阵的行数
int row_size = matrix.size();
// 定义二分查找的左右边界
int left = 0;
int right = col_size * row_size - 1; // 一维化后最后一个元素的索引
// 二分查找循环
while (left <= right) {
// 计算中间索引
int mid = (left + right) / 2;
// 将一维索引mid转换为二维坐标(行和列)
int x = mid / col_size; // 计算当前mid对应的行索引
int y = mid % col_size; // 计算当前mid对应的列索引
// 进行比较
if (matrix[x][y] < target) {
// 如果当前值小于目标值,移动左边界到 mid + 1
left = mid + 1;
} else if (matrix[x][y] > target) {
// 如果当前值大于目标值,移动右边界到 mid - 1
right = mid - 1;
} else {
// 找到目标值,返回true
return true;
}
}
// 未找到目标值,返回false
return false;
}
};
以思路一为例进行调试
cpp
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
// 函数名称:searchMatrix
// 输入参数:一个二维矩阵matrix和一个整数target
// 返回值:如果target在矩阵中,则返回true;否则返回false
bool searchMatrix(vector<vector<int>>& matrix, int target) {
// 获取矩阵的列数
int col_size = matrix[0].size();
// 获取矩阵的行数
int row_size = matrix.size();
// 定义二分查找的左右边界
int left = 0;
int right = col_size * row_size - 1; // 一维化后最后一个元素的索引
// 二分查找循环
while (left <= right) {
// 计算中间索引
int mid = (left + right) / 2;
// 将一维索引mid转换为二维坐标(行和列)
int x = mid / col_size; // 计算当前mid对应的行索引
int y = mid % col_size; // 计算当前mid对应的列索引
// 进行比较
if (matrix[x][y] < target) {
// 如果当前值小于目标值,移动左边界到 mid + 1
left = mid + 1;
} else if (matrix[x][y] > target) {
// 如果当前值大于目标值,移动右边界到 mid - 1
right = mid - 1;
} else {
// 找到目标值,返回true
return true;
}
}
// 未找到目标值,返回false
return false;
}
};
int main(){
vector<vector<int>> matrix={{1,3,5,7},{10,11,16,20},{23,30,34,60}};
int target=3;
Solution s;
if (s.searchMatrix(matrix,target))
{
cout<<"true";
}else{
cout<<"false";
}
return 0;
}
LeetCode 面试经典 150_二分查找_搜索二维矩阵(112_74)原题链接
欢迎大家和我沟通交流(✿◠‿◠)