杨氏矩阵
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
杨氏矩阵如图所示
题目要求时间复杂度小于O(N),可以把上面矩阵看成一个二维数组,四行四列,时间复杂度要求的意思就是不能一个个数字和目标数字进行比较。
可以先从每一行的最后一个数字和目标数字进行比较,比如查找数字7,和第一行第四个数字进行比较,7>4,就直接排除第一行
接着7和第二行的最后一个数字进行比较,7<8,就证明可以排除整个数组的最后一列。
代码编写:
#include <stdio.h>
int FindNum(int a[][3], int x, int y, int num)
{
int i = 0;
int j = y-1;
while (i < x && j >= 0)//结束条件
{
if (a[i][j] < num)//目标数字大于数组每行的最后一个数字,直接跳过一行
{
i++;
}
else if (a[i][j] > num)//目标数字小于数组每行的最后一个数字,直接忽略一列
{
j--;
}
else
{
return 1;//证明a[i][j]和num相等,返回1,找到了
}
}
return 0;//循环结束证明没找到,返回0
}
int main()
{
int arr[][3] = { {1,2,3},{4,5,6},{7,8,9} };
int num = 0;
scanf("%d", &num);
int ret = FindNum(arr, 3, 3, num);
if (ret == 1)
{
printf("找到了:%d\n", num);
}
else
{
printf("没找到!");
}
return 0;
}