二维数组的查找
注:如果代码出现了段错误问题,可能是没有考虑到空数组(至少包括[]、[[]]两种空的二维数组),也就是行或者列为空的情况。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/88691e711a15d4d9908186651cab2e92.png)
关于二维vector的常见操作
参考下面文章:C++ 中vector的嵌套使用
注意,二维vector的初始化除了象上面文章里面采用中间vector来操作,c++11支持列表初始化更方便,具体见下面程序。
int r = arr.size(); //取二维vector的行,
int c = arr[0].size();//取二维vector的列,
1.暴力查找
即遍历二维数组中所有元素。
#include<iostream>
#include<vector>
using namespace std;
bool Find(int target, vector<vector<int>> array)
{
if(array.empty()) return false;
int r = array.size();
int c = array[0].size();
for(int i=0; i<r;i++)
for(int j=0;j<c;j++)
{
if(array[i][j] == target)
return true;
}
return false;
}
int main()
{
int target;
vector<vector<int>> arr = {{1,2,3},{4,5,6},{7,8,9}}; //c98不支持这样输入
cout<<"请输入待查找的数字"<<endl;
cin>>target;
if(Find(target,arr))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
return 0;
}
2.利用数组的特性/二叉搜索树
利用数组从左到右单增,从上到下单增特性。可从数组左下角或者右上角开始,以左下角为例。
记左下角数据为s,目标为t。若t>s,则说明t在s的右边某一列中。此时可将s位置增加一列,继续上述判断。同理,若t<s,则说明t在s上边某一行中,此时可将s位置提高(减少)一行,继续上述判断。直到s=t。
可以看到,从左下角或者右上角看的话,该二维数组可以抽象为一棵二叉搜索树,以左下角为根节点为例,当t>s时,就进入s的右子树去查找,也就是列+1;当t<s时,就进入s的左子树进行查找,即行-1;
#include <iostream>
#include <vector>
using namespace std;
bool Find_num(vector<vector<int> > arr , int target) //算法部分
{
if(!arr.empty())
{
int r = arr.size();
int c = arr[0].size();
//从左下角开始
int i,j;
for(i=r-1,j=0;i>=0,j<=c-1;)
{
if(target > arr[i][j]) //对第j列而严,a[i][j]已经为最大
{
j++;
continue;
}
if(target < arr[i][j]) //对第i行而言,a[i][j]为最小值
{
i--;
continue;
}
if(target == arr[i][j])
return true;
break;
}
return false;
}
}
int main()
{
int target;
vector<vector<int> >arr1 = {{1,2,3},{4,5,6},{7,8,9}}; //c++98编译不支持这样初始化
cout<<"请输入查找的数"<<endl;
cin>>target;
if(Find_num(arr1, target))
{
cout<<"找到了"<<endl;
}
else
cout<<"没找到"<<endl;
return 0;
}