2.
杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
数组:
1 2 3
2 3 4
3 4 5
1 3 4
2 4 5
4 5 6
1 2 3
4 5 6
7 8 9
代码1:
#include<stdio.h>
int FindNum(int arr[3][3],int k,int row,int col)
{
int x=0;
int y=col-1;
while(x<=row-1 && y>=0)
{
if(arr[x][y]>k)
{
y--;
}
else if(arr[x][y]<k)
{
x++;
}
else
{
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int k=7;
int ret = FindNum(arr,k,3,3);
if(ret==1)
{
printf("找到了\n");
}
else
{
printf("找不到\n");
}
return 0;
}
需求增加:不能在函数中打印,要在main函数输出下标
返回性参数解决函数返回多个值问题
由于函数中return不能同时返回两个参数
例如return x,y;
“,”是逗号表达式,返回的是y的值
解决方法:通过传递变量的地址,通过在函数内部解引用地址,将返回值赋给*地址,可以实现改变函数外部的变量
例如:
#include<stdio.h>
void test(int* px,int* py)
{
int a=2;
int b=3;
*px=a;
*py=b;
}
int main()
{
int x=0;
int y=0;
test(&x,&y);
printf("x=%d y=%d",x,y);
return 0;
}
代码2:
#include<stdio.h>
int FindNum(int arr[3][3],int k,int* px,int* py)
{
int x=0;
int y=*py-1;
while(x<=*px-1 && y>=0)
{
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;
int x=3;
int y=3;
//返回性参数
int ret = FindNum(arr,k,&x,&y);
if(ret==1)
{
printf("找到了\n下标是[%d][%d]",x,y);
}
else
{
printf("找不到\n");
}
return 0;
}