杨氏矩阵是一个二位数组,这个数组无论横向纵向都是递增的。
比如数组
1 4 7
2 5 8
3 6 9
要想时间复杂度小于o(n)就不能遍历整个数组,其实只需判断这个i行j列的数组的arr[i-1][j-1]是否等于要找的数,如果大于要找的数,说明要找的数一定在该数的左下方。如果小于要找的数,说明要找的数一定在该数的下方。
实现代码如下
#include<stdio.h> //(markdown bug)
#include<stdlib.h>
int find_it(int arr[3][3], int key)
{
int i = 0;
int j = 2;
while (i < 3 && j >= 0)
{
if (key == arr[i][j])
{
return 1;
}
else if (key > arr[i][j])
{
i++;
}
else if (key < arr[i][j])
{
j--;
}
}
return 0;
}
int main()
{
int arr[3][3] = { {1,4,7},{2,5,8},{3,6,9} };
int sz = sizeof(arr) / sizeof(arr[0][0]);
int key = 5;
int t =find_it(arr, key);
if (t == 0)
printf("no");
else if(t ==1)
printf("yes");
system("pause");
return 0;
}