题目:编写程序,在杨氏矩阵中查找某个数字是否存在并且打印下标(时间的复杂度小于O(N)。
什么是杨氏矩阵:矩阵的每行从左到右是递增的,每列从上到下是递增的。
例如:
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
1、思路:右上角的元素特殊,它是第0行最大的数,是第2列最小的数。用要查找的数与这个特殊元素比较,每次比较都可以排除一列或者一行,用x表示行,y表示列。假设我们要找的元素是7,首先3<7,因为3是第0行中最大的元素,所以排除第0行,x++;此时右上角元素锁定为6,6<7,因为6是第1行中最大的数,所以排除第1行,x++;此时到了第2行,元素锁定为9,9>7,要找的元素就锁定第2行,y--得到8,8>7,继续y--得到7,这样就找到了我们要找的元素,如果在这一行中找不到,说明我们要找的元素在矩阵中没有。
2、因为时间复杂度小于O(N),不能去遍历数组
3、代码实现:
#include<stdio.h>
int FindNum(int arr[3][3],int k, int* px, int* py)
{
int x=0; //右上角元素的下标arr[0][2]
int y=*py-1;
while(x<=*px-1&&y>=0)//循环条件:查找的行x<=2(x++过程中),查找的列y>=0(y--过程中),具体看
//给的数组来看
{
if(arr[x][y]>k)
{
y--;
}
else if(arr[x][y]<k)
{
x++;
}
else
{
*px=x;
*py=y;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int k=7; //假设要找的元素是7,根据自己要求查找
int x=3,y=3; //具体看给的数组传相应的行和列
int ret=FindNum(arr,k,&x,&y);//查找元素的函数,因为这个函数要带回下标,所以参数取地址传过
//去,如果不传地址,形参的改变不能影响实参
if(ret==1)
{
printf("找到了\n");
printf("下标是:%d %d\n",x,y);
}
else
{
printf("找不到\n");
}
return 0;
}
4,如果你学会了,给个免费的赞在走吧