C语言初阶习题【29】杨氏矩阵
1. 题目描述——杨氏矩阵
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
2. 思路
3. 代码实现1
#include<stdio.h>
void find_k(int arr[3][3], int row, int col, int k)
{
int x = 0;
int y = col-1;
int flag = 0;
while(x <= row - 1 && y >= 0) //行一直增加,但是最大是2,列一直减少,但是最小是0,如果超过这个范围就超出数组范围了
{
if (k > arr[x][y])
{
x++;
}
else if (k < arr[x][y])
{
y--;
}
else
{
printf("找到了,下标是:%d,%d\n",x,y);
flag = 1;
break;
}
}
if(flag==0)
printf("没找到\n");
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 7;
find_k(arr, 3, 3,k);
return 0;
}
4. 代码实现2
在代码实现1的基础上进行改进,我们把找到元素的下标,也返回出来
这里涉及到我们的函数只有一个返回值,所以我们使用指针来把我们的下标带回来
#include<stdio.h>
int find_k(int arr[3][3], int *row, int *col, int k)
{
int x = 0;
int y = *col - 1;
while (x <= *row - 1 && y >= 0) //行一直增加,但是最大是2,列一直减少,但是最小是0,如果超过这个范围就超出数组范围了
{
if (k > arr[x][y])
{
x++;
}
else if (k < arr[x][y])
{
y--;
}
else
{
*row = x;
*col = y;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 7;
int row = 3;
int col = 3;
int ret = find_k(arr, &row, &col, k);
if (ret == 0)
{
printf("找不到!\n");
}
else
{
printf("找到了,数组下标为(%d,%d)", row, col);
}
return 0;
}