杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
数组:
1 2 3
2 3 4
3 4 5
1 3 4
2 4 5
4 5 6
分析:通过观察,我们发现右上角的数字比较特殊,它是所在行的最大数字,同时又是所在列的最小数字,所以我们就以右上角的数字和我们要找的数字相比较,如果要找的数字比右上角的数字大,我们可以直接跳到下一行,同理,如果要找的数字比右上角的数字小,可以去掉右上角数字所在的列。
具体代码如下:
#include <stdio.h>
#include <stdlib.h>
int Find(int arr[3][3], int *px, int *py, int k)
{
int x = 0;//右上角数字的行
int y = *py - 1;//右上角数字的列
while (x < *px&&y >= 0)//避免越界访问
{
if (arr[x][y] < k)
{
x++;//加上一行
}
else if (arr[x][y]>k)
{
y--;//去掉一列
}
else
{
*px = x;
*py = y;
return 1;//找到了,返回1
}
}
return 0;//没找到,返回0
}
int main()
{
int arr[3][3] = { 1, 2, 3,2,3,4,7,8,9 };
int k = 7;
int x = 3;//行数
int y = 3;//列数
int ret = Find(arr, &x, &y,k);//返回型参数(利用指针把值带过去)
if(ret ==1)
{
printf("找到了,下标为:%d %d\n",x,y);//注意,这里不能写成&x,&y,因为在函数里面&y和&x经过了解引用
}
else
{
printf("找不到\n");
}
system("pause");
return 0;
}