给定一个M*N的二维数组,在每行、或者每列上的元素都是按升序排列的(从小到大),既:matrix[i][j]<matrix[i][j+1];matrix[i][j]<matrix[i+1][j]
要求设计一个算法,在矩阵中查找是否存在给定的值(target)
因为这是一个每行每列的矩阵,我们很快就想到可以对每一行或者每一列进行二分查找,看target是否存在于二维数组中,对M*N二维矩阵,
此算法复杂度为O(M*logN),很容易写出以下代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool findtarget(vector<vector<int> >& matrix, int target){
int m = matrix[0].size() ;
int n = matrix.size();
for(int i = 0;i < n;i++){
if(binary_search(matrix[i].begin() ,matrix[i].end(),target)){ //运用STL中的二分查找函数
return true;
}
}
return false;
}
int main()
{
int m,n;
cin>>m>>n;
vector<vector<int> > a;
vector<int> line;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int num;
cin>>num;
line.push_back(num);
}
a.push_back(line);
}
int target;
while (1){
cin>>target;
bool iffindtarget

在每行和每列都升序排列的二维数组中查找目标值,可以通过二分查找或扫描对角线的方式实现。二分查找算法复杂度为O(M*logN),而扫描对角线的方法复杂度为O(M+N)。二分查找可能出现错误,而对角线扫描法提供了一种有效解决方案。
最低0.47元/天 解锁文章
969

被折叠的 条评论
为什么被折叠?



