杨氏矩阵:有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);
#include<stdio.h>
//
int find_num(int arr[3][3],int r,int c,int k)
{
int x=0;
int y=c-1;
while(x<r&&y>=0)
{
if(k<arr[x][y])
//与右上角元素比较
{
y--;
}
else if(k>arr[x][y])
{
x++;
}
else
//等于相当于找到了
{
printf("%d %d\n",x,y);
return 1;
}
}
return 0;//找不到
}
int main()
{
int arr[3][3]={1,2,3,4,5,6,7,8,9};
int k=0;
scanf("%d",&k);
int ret=find_num(arr,3,3,k);
printf("%d\n",ret);
return 0;
}
返回值用结构体来表示(注意返回值只能为一个数值,所以不能返回return x,y)
#include<stdio.h>
//
struct point
{
int x;
int y;
};
struct point find_num(int arr[3][3],int r,int c,int k)
{
int x=0;
int y=c-1;
struct point p={-1,-1};
while(x<r&&y>=0)
{
if(k<arr[x][y])
//与右上角元素比较
{
y--;
}
else if(k>arr[x][y])
{
x++;
}
else
//等于相当于找到了
{
p.x=x;
p.y=y;
return p;
}
}
return p;//找不到
}
int main()
{
int arr[3][3]={1,2,3,4,5,6,7,8,9};
int k=0;
scanf("%d",&k);
struct point ret=find_num(arr,3,3,k);
printf("%d %d\n",ret.x,ret.y);
return 0;
}
当然也可以通过指针来修改变量
#include<stdio.h>
//
int find_num(int arr[3][3],int* px,int* py,int k)
{
int x=0;
int y=*py-1;
while(x<*px&&y>=0)
{
if(k<arr[x][y])
//与右上角元素比较
{
y--;
}
else if(k>arr[x][y])
{
x++;
}
else
//等于相当于找到了
{
*px=x;
*py=y;
return 1;
}
}
*px=-1;
*py=-1;
return 0;//找不到
}
int main()
{
int arr[3][3]={1,2,3,4,5,6,7,8,9};
int k=0;
int x=3;//行
int y=3;//列
scanf("%d",&k);
int ret=find_num(arr,&x,&y,k);
if(ret==1)
{
printf("%d %d\n",x,y);
}
else
printf("找不到\n");
return 0;
}