这道题大家都会做,使用暴力算法遍历整个数组。但是题目要求时间复杂度小于O(n),这样做显然不合题意,所以,通过分析杨氏矩阵的特点,我们发现矩阵右上角的那个数为一行中最大的,一列中最大的。所以通过和那个数比较,可以比较一下就杀掉一行或者一列,这样大大降低了时间复杂度。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define ROW 5 //设置矩阵的行数
#define COL ROW //设置矩阵的列数
#define K 20 //设置要寻找的数
int My_Find(int arr[][COL], int row, int col, int k) //封装成函数矩阵
{
int x = 0;
int y = col - 1;
while (x < row && y >= 0)
{
if (arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
y--;
}
else
{
printf("%d %d\n", x, y); //打印坐标
return 1;
}
}
return 0;
}
int main()
{
int arr[ROW][COL] = { 0 };
int* pa = &arr[0][0];
for (int i = 0; i < ROW * COL; i++) //杨氏矩阵赋初值
{
*(pa + i) = i;
}
int ret = My_Find(arr, ROW, COL, K);
if (ret == 1)
{
printf("找到了\n");
}
else
{
printf("没找到\n");
}
system("pause");
return 0;
}