题目:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是 递减的,请编写程序找某个数字是否存在
要求实现复杂度小于O(n)
分析:
右上角的数是一行中最大的,一列中最小的
左下角的数是一行中最小的,一列中最大的
这次取右上角的数来做演示
若我们想找的数为7,将右上角的数与想找的数比较,
若右上角的数大于想找的数,又因为右上角的数是一列中最小的数,所以去掉一列
若右上角的数小于想找的数,又因为右上角的数是一行中最大的数,所以去掉一行
如此循环就能找到要找的数了。
代码:
下面我们来写代码:
#include<stdio.h>
int FoundNum(int arr[3][3], int k, int row, int col)
{
int x = 0;
int y = col - 1;//arr[x][y]为矩阵右上角的数
while (x<=2&&y>=0)
{
if (arr[x][y] < k)
{
x++;//若右上角的数小于要找的数,则去掉上面一行
}
else if (arr[x][y] > k)
{
y--;//若右上角的数大于要找的数,则去掉右面面一列
}
else
{
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 = FoundNum(arr, k, row, col);
if (ret == 1)
{
printf("找到了,");
}
else
{
printf("找不到\n");
}
return 0;
}
代码虽然显示找到了,但是如何验证是否正确呢?
是否能返回被找到数的下表呢?
接下来我们来进行改进。
首先,我们知道函数只有一个返回值,所以不可能返回下标,
但是我们可以通过指针来获得下标
#include<stdio.h>
int FoundNum(int arr[3][3], int k, int *px, int *py)
{
int x = 0;
int y = *px - 1;//arr[x][y]为矩阵右上角的数
while (x<=2&&y>=0)
{
if (arr[x][y] < k)
{
x++;//若右上角的数小于要找的数,则去掉上面一行
}
else if (arr[x][y] > k)
{
y--;//若右上角的数大于要找的数,则去掉右面面一列
}
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 = FoundNum(arr, k, &x,&y);
if (ret == 1)
{
printf("找到了,");
printf("下标为:x,y");
}
else
{
printf("找不到\n");
}
return 0;
}
以上就是本篇文章的内容了,很感谢你能看到这里
如果觉得内容对你有帮助的话,不妨点个关注
我会继续更新更高质量的内容,我们一同学习,一同进步!