题目描述:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
如上所述,我们所描述的就是一个二维数组,每行从左到右是递增的,每列从上到下是递增的,这样的数组就是一个杨氏矩阵,如下图所示:

上图是一个3*3的二维数组,也可以说是一个3*3的杨氏矩阵。
我们在这样的一个数组中查找一个数据,它的时间复杂度是O(N)。
我们在上图杨氏矩阵中可以发现,它的右上角的元素具有特殊性,这个元素是一行中最大的元素,同时也是这一列当中最下的元素。
思路分析:
杨氏绝阵从上到下,从左到右都是递增的,观察杨氏矩阵我们发现每一列上下的元素值都相差3。但是这个规律对我们来说并没有什么实际的用处。既然我们规定了时间复杂度为O(N),那么我们不防从最后一列开始,一列一列的进行查找,如果找不到我们要找的数值K,那么我们就列值减减,向前一列找,按照之前的方式 循环进行,直到查找到元素K。
找到元素K,我们用两个变量进行保存,输出元素所在的位置,没找到则给出提示没有找到。
图示:

代码实现:
void Seek(int arr[3][3], int k,int row,int col)//数组行值可以省略但是列的大小不能省略
{
int i = 0;
int j = col-1;
int r = 0;
int c = 0;
while (i<=2 && j>=0)
{
if (arr[i][j] < k)
{
i++;
}
if (arr[i][j] > k)
{
j--;
}
if (arr[i][j] == k)
{
r = i + 1;
c = j + 1;
printf("找到了,在第%d行,第%d列\n", r, c);
break;
}
}
if (i > 2||j<0 )
{
printf("此数组中不存在%d\n", k);
}
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 0;//被查找数字
scanf("%d", &k);
//Seek(arr, k,3,3);查找函数
//查找到了返回1,未查找到返回0
Seek(arr, k,3,3);
return 0;
}