杨氏矩阵说明:即一个n*n的矩阵,从左往右依次递增,从上往下依次递增
例如: 图片.png

就是一个简单的杨氏矩阵现在要查找一个数字是否在该矩阵内部,并且时间复杂度要小于O(N),即不能顺序查找首先观察杨氏矩阵的规律,右上角的元素是本列最小,本行最大。因此只要和右上角的元素进行比较,若被查找元素小于右上角元素,则说明该元素看到不在右上角元素对应的列,则矩阵可以向左缩减列,若被查找元素大于右上角元素,则说明该元素不在右上角元素的同一行,则矩阵可以向下缩减一行,按照这个思路迭代的去比较被查找元素与右上角元素的关系,若在某一次二者相等,则在杨氏矩阵中存在该元素,若找到左下角的元素仍然没有找到该元素,则说明该元素不存在于杨氏矩阵中。
同样的思路可用于左下角的元素
代码实现:
int Find_Num(int arr[3][3], int k, int* row, int* col)//传入一个3*3的矩阵,并传入被查找元素k以及行数的指针,列数的指针
{
    int x = 0;
    int y = *col - 1;
    while (x <= *row - 1 && y >= 0)//循环终止条件,找到了左下角元素
    {
        if (arr[x][y] > k)
        {
            y--;//若右上角元素大于被查找元素,则向左列查找
        }
        if (arr[x][y] < k)
        {
            x++;//若右上角元素小于被查找元素,则向下行查找
        }
        else
        {
            *row = x;//若二者相等,则将该元素的坐标位置返回
            *col = y;
            return 1;
        }
    }
    return 0;
}
注:传入指针的目的是方便改变外部实参的值,使得外部实参可以获取被查找元素的坐标值

Tired
1 声望1 粉丝

新手小白,力争成为c++大佬,c++永远滴神!!!