//杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
数组:
1 2 3
2 3 4
3 4 5
1 3 4
2 4 5
4 5 6
1 2 3
4 5 6
7 8 9
分析:定位出右上角的数,
如果key<右上角数,则数字肯定在右上角的左边部分,(j–)
即前一列的数字定位成新的右上角数。
如果key>右上角数,则数字肯定在这个数的下部分,(i++)
即下一行的数字定位成新的右上角数。
知道查找到数字,返回坐标,若不存在返回(-1,-1)
#include<stdio.h>
#include<Windows.h>
void FindKey(int arr[3][3], int *px, int *py, int key)
{
int x = 0;
int y = *py - 1;
while (x < *px&&y >= 0)
{
if (arr[x][y] == key)
{
*px = x;
*py = y;
return;
}
else
{
if (arr[x][y] < key)
{
x++;
}
else
{
y--;
}
}
}
*px = -1;
*py = -1;
}
int main()
{
int arr[ROW][COL] = { { 1, 2, 3 }, { 2, 3, 4 }, { 3, 4, 5 } };
int x = 3;
int y = 3;
FindKey(arr, &x, &y, 5);
printf("%d,%d", x, y);
system("pause");
return 0;
}