要求:
杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
数组:
1 2 3
2 3 4
3 4 5
#include<stdio.h>
#include<stdlib.h>
int find_yang(int a[][3],int row,int n)
{
int i = 0;
int j = 2;
while((i<row)&&(j>=0))
{
if(n>a[i][j])
{
i++;
}
else if(n < a[i][j])
{
j++;
}
else
{
return 1;
}
}
return -1;
}
int main()
{
int yang[][3] =
{{1,2,3},{4,5,6},{7,8,9}};
int n = 0;
printf("please Enter:");
scanf("%d",&n);
printf("ret = %d\n",find_yang(yang,3,n));
system("pause");
return 0;
}
-------------------- 杨氏矩阵里找数字 ------------------------------
#include<stdio.h>
int found(int a[][3],int j,int n)
{
int i = 0; //行
j--; //因为传过来的是列,列在主函数已经已经确定,是3,那么这里3--,j就是2,是最后一列的列号
for(i = 0;i<=j;) //因为我们是从第一行的最后一个数字开始找,如果大于这个数字,就找下一行(i+1),如果小于这个数字,就找左边一列(j-1),那么这里i<j就很好理解了。第二个分号后面是循环条件,这里的循环条件是被限制的,
{
if(n>a[i][j]) //(这里的a[i][j]最初是a[0][2],是第一行的最后一个数字。)如果找的数字大于它,那么...
{
i++; //行+1,就往这个数字下面取去找
}
else if(n<a[i][j]) //如果找的这个数字小于a[i][j],那么就找这个数字左边的那个数字,也就是行不变,列-1,(j-1);
{
j--;
}
else if(n == a[i][j])
{
return 1;
}
}
}
int main()
{
int found(int a[][3],int j,int n);
int a[][3] = {{1,2,3},{2,3,4},{3,4,5}};
int n;
printf("请输入要找的数字n:");
scanf("%d",&n);
if(found(a,3,n)==1)
{
printf("找到了!\n");
}
else
{
printf("找不到!\n");
}
return 0;
}