力扣练习——51 搜索二维矩阵
1.问题描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。要求使用二分查找。
该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false
可使用以下main函数:
int main()
{
vector<vector<int> > matrix;
int target;
int m,n,e;
cin>>m;
cin>>n;
for(int i=0; i<m; i++)
{
vector<int> aRow;
for(int j=0; j<n; j++)
{
cin>>e;
aRow.push_back(e);
}
matrix.push_back(aRow);
}
cin>>target;
bool res=Solution().searchMatrix(matrix,target);
cout<<(res?"true":"false")<<endl;
return 0;
}
2.输入说明
首先输入matrix的行数m、列数n,
然后输入m行,每行n个整数。
最后输入一个整数target。
3.输出说明
输出true或false
4.范例
输入
3 4
1 3 5 7
10 11 16 20
23 30 34 50
3
输出
true
5.代码
#include <iostream> #include <queue> #include <cstdlib> #include <cstring> using namespace std; bool searchMatrix(vector<vector<int> > matrix, int target) { //二分查找判断target是否存在 //直接将所有行拼接成一行 int m = matrix.size();//行数 int n = matrix[0].size();//列数 if (matrix[0][0] > target || matrix[m - 1][n - 1] < target)//若target不在提供的范围内(不满足大于等于最小值,小于等于最大值) return false; vector<int>nums;//不要写成nums(m*n),否则总长度会变成2*m*n for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { int tmp = matrix[i][j]; nums.push_back(tmp); } } //二分查找 int low = 0; int high = m * n - 1; while (low <= high) { int mid = (low + high) / 2; if (nums[mid] > target)//左半边寻找 high = mid - 1; else if (nums[mid] < target) low = mid + 1; else return true; } return false; } int main() { vector<vector<int> > matrix; int target; int m, n, e; cin >> m; cin >> n; for (int i = 0; i < m; i++) { vector<int> aRow; for (int j = 0; j < n; j++) { cin >> e; aRow.push_back(e); } matrix.push_back(aRow); } cin >> target; bool res = searchMatrix(matrix, target); cout << (res ? "true" : "false") << endl; return 0; }