来认识并了解一下:不一样的杨氏矩阵

简介: 来认识并了解一下:不一样的杨氏矩阵

对于杨氏矩阵,不知道大家了解多少!想必大家会一开始就认为是一个杨辉三角吧!!其实这二者并没有什么关联!杨氏矩阵:顾名思义,就是一个矩阵:


    这儿是百度百科的搜索内容:杨氏矩阵,是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);  链接为:杨氏矩阵_百度百科   感兴趣的读者,可以进行欣赏一下!!


言归正传,根据上面的内容:有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在!!笔者就是在这个基础上进行:编写程序,在这样的杨氏矩阵中查找某个数字是否存在!!!


请看笔者的思考部分:


0a2653c851af460fa595bd959398a8f1.png


从矩阵的右上角开始进行查找:原因是:在矩阵的最上角部分:该数字是:一行(i)最小,一列(j)最大的元素!若需要找的元素比它大,则进行下一列i++的查找,一直找到比它小的元素所在的那一列!在进行j--;一直找到该数字!或许等数组的最大值都比该值小,那就是在该数组中,没有该值!!若需要找的元素比它小,则进行j--,一直找到该元素,或者就是没有该数字!


对于上面的理解部分:笔者已经大致讲解清楚,若有什么疑问,请参考代码,进行思考,或者,进行私聊笔者!


请看笔者的代码部分:


#include <stdio.h>
void find_num_in_young(int arr[3][3], int k, int r, int c)
{
  int i = 0;
  int j = c - 1;
  int flag = 0;
  while (i <= r - 1 && j >= 0)
  {
  if (arr[i][j] < k)
  {
    i++;
  }
  else if (arr[i][j] > k)
  {
    j--;
  }
  else
  {
    //找到了
    flag = 1;
    printf("找到了,下表为:%d %d\n", i, j);
    break;
  }
  }
  if (flag == 0)
  {
  printf("找不到\n");
  }
}
int main()
{
  int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
  int k = 0;
  scanf_s("%d", &k);
  find_num_in_young(arr, k, 3, 3);
  return 0;
}


在这段代码中,比较重要的部分就是在于:函数部分!请大家仔细思考一下!!!


因为是从右上角开始进行查找的!所以有:int i = 0;    int j = c - 1;  这样显得很合理!


代码的运行结果为:


2d65d23f6d4748949b924e4057485923.png


对于上述的代码,也可以用指针的方法来进行书写,请看笔者代码!


#include <stdio.h>
void find_num_in_young(int arr[3][3], int k, int *px, int *py)
{
  int i = 0;
  int j = *py - 1;
  int flag = 0;
  while (i <= *px - 1 && j >= 0)
  {
  if (arr[i][j] < k)
  {
    i++;
  }
  else if (arr[i][j] > k)
  {
    j--;
  }
  else
  {
    //找到了
    flag = 1;
    *px = i;
    *py = j;
    break;
  }
  }
  if (flag == 0)
  {
  *px = -1;
  *py = -1;//返回一个无关紧要的值 ,加以区分!!
  }
}
int main()
{
  int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
  int k = 0;
  scanf_s("%d", &k);
  int x = 3;
  int y = 3;
  find_num_in_young(arr, k, &x, &y);
  if (x == -1 && y == -1)
  {
  printf("找不到\n");
  }
  else
  printf("找到了,下表为:%d %d\n", x, y);
  return 0;
}

上面的代码,大家仔细分析,也就能区分出来:笔者为什么会这样去写了!


代码的运行结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


主要原因还是在于:在函数部分,返回值只能有一个,但是对于有两个返回值类型的数据,可以用void类型来进行传址调用!所以显得很简单!对于其他的用两个for循环,依次进行遍历数组的简单做法,笔者在此就不做过多的讲述!或者也可以在函数里面定义一个数组,里面存放找到后该元素的两个下标,在返回数组名,也是可以的!在此,笔者也不进行讲述,有想法的老铁!请自我思考!


相关文章
|
算法 测试技术 C++
C++算法:美丽塔O(n)解法单调栈
C++算法:美丽塔O(n)解法单调栈
蓝桥杯:2021省赛 例题:直线
蓝桥杯:2021省赛 例题:直线
59 0
|
机器学习/深度学习 算法
杨氏矩阵
杨氏矩阵
33 0
|
8月前
|
算法 C语言
杨氏矩阵查找算法
杨氏矩阵是一种特殊矩阵,其每一行和每一列都是递增的。要在一个杨氏矩阵中查找特定数值,可以从右上角或左下角开始,通过比较当前元素与目标值的大小来决定向下或向左移动,直到找到目标值或超出边界。这种方法的时间复杂度为O(N)。文中还提供了一段C语言代码实现此查找算法,并给出了牛客网上的相关练习题链接。
40 1
|
7月前
|
算法
OJ刷题:杨氏矩阵
OJ刷题:杨氏矩阵
34 0
|
8月前
|
存储 Java 索引
第十四届蓝桥杯集训——数组(一维)
第十四届蓝桥杯集训——数组(一维)
83 0
|
算法
算法篇-杨氏矩阵
算法篇-杨氏矩阵
109 0
|
算法 测试技术 Python
第十二届蓝桥杯《杨辉三角》-二分法
第十二届蓝桥杯《杨辉三角》-二分法
105 0
|
机器学习/深度学习 人工智能 移动开发
|
机器学习/深度学习 人工智能 移动开发

热门文章

最新文章