杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在,并返回其地址。
时间复杂度小于O(N);
————————————————————————————————————
对题目的解释:
由于杨氏矩阵具有每行从左到右是递增的,每列从上到下是递增的,所以我们在对数据进行查找是并不需要从第一个一直遍历到我们所需要查找的数,对杨氏矩阵的查找,可以通过下图来进行解释
需要在这个杨氏矩阵中找到9这个数字并返回其位置:
1>拿所需查找的数字9与第一行最后一个数字进行比较,
由于9<5,因此9不可能在15所在的列(因为每一列是递增的,15是该列中最小的数字),所以列往前移动一列。
2>再将9与11进行比较,由于9<11,所以列往前移动一列。
3>由于7>9,因此行加一,移到下一行。
4>由于8>9,因此行加一,移到下一行。
5>由于9=9,因此找到该数字,并返回其地址下标。
若直到最后一行,第一列都没有找到与其相等的数字,则表示该数组中没有该数字。
void Search(int arr[][3],int *px,int *py, int num)
{
int j = *py - 1;
int i = 0;
while (i < *px && j >= 0)
{
if (num > arr[i][j])
{
i++;
}
else if (num < arr[i][j])
{
j--;
}
else
{
*px = i;
*py = j;
return;
}
}
*px = -1;
*py = -1;
}
int main()
{
int x = 3;
int y = 3;
int arr[3][3] = { { 1, 2, 3 }, { 2, 3, 4 }, { 3, 4, 5 } };
Search(arr,&x,&y,5);
printf("得到该数字下标为<%d,%d>\n", x, y);
system("pause");
return 0;
}