有这样一种矩阵,其每一行的元素依次递增,每一列的元素也依次递增
举例如:
1,2,3
4,5,6
7,8,9
这样的矩阵称为杨氏矩阵,现在要在矩阵中查找某个元素是否存在,要求返回元素下标该怎么做呢?
最简单的做法,把这个矩阵放到二维数组中,把这个数组遍历一遍,找到该元素就返回下标,否则返回0.观察杨氏矩阵的排列,从中找出规律,我们可以写出更加高效的搜索方法,就以这个数组为例,假设a[3][3]={{1,2,3}
{4,5,6}
{7,8,9}},
我们要查找的元素为5,现在我们锁定数组中的元素a[0][2]即3,因为3小于5,而杨氏矩阵的每一行依次递增,所以5肯定不在矩阵的这一行,元素锁定到a[1][2]即6,因为6大于5,而杨氏矩阵的每一列依次递增,所以以a[1][2]为开头的这一列必然都大于5,此时锁定a[1][1],此时找到5,返回下标即可
实现代码:
<span style="font-size:18px;">struct sub{
int col;
int row;
};
//返回类型为结构体,a为传入的数组,ROW和COL分别为传入数组的行数和列数,
//sr为传入的结构体,用于返回两个下标
struct sub search_num(int *a, int num,int ROW, int COL, struct sub sr)
{
int c = COL;
sr.col = -1; //初始化为-1若未找到该元素返回值为-1
sr.row = -1;
ROW = 0;
COL = COL - 1;
while ((ROW >= 0) && (COL <= (c - 1)))
{
if (*(a+ROW*c+COL)> num)
{
COL--;
}
else if (*(a + ROW*c + COL) < num)
{
ROW++;
}
else
{
sr.col = COL; //找到该元素替换下标
sr.row = ROW;
break; //找到就结束循环
}
}
return sr; //找到该元素返回下标,否则返回-1,-1
}</span>
这个函数适用与求解任意维数的二维数组。