题目:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
在杨氏矩阵中查找某个数,可以利用矩阵的有序性质来提高查找效率。以下是查找某个数在杨氏矩阵中是否存在的一种高效思路:
从矩阵的右上角开始查找
由于杨氏矩阵的每一行是从左到右递增的,每一列是从上到下递增的,我们可以从矩阵的右上角开始查找。以下是查找步骤:1.初始化:从矩阵的右上角位置开始,即第一行的最后一个元素。
2.比较当前元素与目标值:
如果当前元素等于目标值,则查找成功,返回当前位置。
如果当前元素大于目标值,则向左移动一列,因为当前列下面的所有元素都会更大。
如果当前元素小于目标值,则向下移动一行,因为当前行左边的所有元素都会更小。
3.重复比较:重复步骤2,直到找到目标值或者超出矩阵的边界。4.结束:如果超出矩阵边界还没有找到目标值,则说明矩阵中不存在该数。
代码如下:
int findnum(int a[][3], int x, int y, int key) //x为行数,y为列数,key为关键字(行列参数自定义调整)
{
int i = 0, j = y - 1; //从右上角开始遍历
while (j >= 0 && i < x)
{
if (a[i][j] < key) //大于当前元素,向左移动一列
{
i++;
}
else if (a[i][j] > key) //小于当前元素,向下移动一行
{
j--;
}
else
{
return 1;//查找成功
}
}
return 0;
}
运行图: