杨氏矩阵(Young tableau)是一个特殊的二维数组,其每一行从左到右递增,每一列从上到下递增。例如
在一般的数组里查找一个数字,最简单的方法就是遍历,时间复杂度为O(N),但在杨氏矩阵中,时间复杂度可以小于O(N)。
思路如下:
设要查找的数为key 二维表的右上角数字为edge
让key与edge比较,若key>edge,则说明在最顶行是找不到key的了,更新edge;
若key<edge,说明在最右列是找不到key的了,更新edge。
C代码实现
#include <stdio.h>
/*
* 在一个3行3列的杨氏矩阵里查找元素key
* arr:要查找的数组
* key:要查找的数字
* px:横坐标
* py:纵坐标
*/
void findNumInYoung(int arr[3][3], int key, int* px, int* py) {
int i = 0;
int j = *py-1;
int flag = 0;
while (i <= *px-1 && j >= 0) {
if (arr[i][j] < key) { //清除顶行
i++;
}
else if (arr[i][j] > key) { //清除最右列
j--;
}
else {
//找到了
flag = 1;
*px = i;
*py = j;
break;
}
}
if (0 == flag) {
*px = -1;
*py = -1;
}
}
int main() {
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int x = 3;
int y = 3;
int key = 5;//要查找的元素
findNumInYoung(arr, key, &x, &y);
if (-1 == x && -1 == y) {
printf("找不到这个数字\n");
}
else {
printf("找到了,坐标是 (%d,%d) \n", x, y);
}
return 0;
}