在杨氏矩阵(Young tableau)中查找元素

391 阅读1分钟

杨氏矩阵(Young tableau)是一个特殊的二维数组,其每一行从左到右递增,每一列从上到下递增。例如

image.png image.png

在一般的数组里查找一个数字,最简单的方法就是遍历,时间复杂度为O(N),但在杨氏矩阵中,时间复杂度可以小于O(N)。

思路如下:

设要查找的数为key 二维表的右上角数字为edge

让key与edge比较,若key>edge,则说明在最顶行是找不到key的了,更新edge;

image.png

若key<edge,说明在最右列是找不到key的了,更新edge。

image.png

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;
}