杨氏矩阵查找数字

//杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于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;
}

猜你喜欢

转载自blog.csdn.net/unique_IT/article/details/90724310