对于杨氏矩阵,不知道大家了解多少!想必大家会一开始就认为是一个杨辉三角吧!!其实这二者并没有什么关联!杨氏矩阵:顾名思义,就是一个矩阵:
这儿是百度百科的搜索内容:杨氏矩阵,是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N); 链接为:杨氏矩阵_百度百科 感兴趣的读者,可以进行欣赏一下!!
言归正传,根据上面的内容:有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在!!笔者就是在这个基础上进行:编写程序,在这样的杨氏矩阵中查找某个数字是否存在!!!
请看笔者的思考部分:
从矩阵的右上角开始进行查找:原因是:在矩阵的最上角部分:该数字是:一行(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; 这样显得很合理!
代码的运行结果为:
对于上述的代码,也可以用指针的方法来进行书写,请看笔者代码!
#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;
}
上面的代码,大家仔细分析,也就能区分出来:笔者为什么会这样去写了!
代码的运行结果为:
主要原因还是在于:在函数部分,返回值只能有一个,但是对于有两个返回值类型的数据,可以用void类型来进行传址调用!所以显得很简单!对于其他的用两个for循环,依次进行遍历数组的简单做法,笔者在此就不做过多的讲述!或者也可以在函数里面定义一个数组,里面存放找到后该元素的两个下标,在返回数组名,也是可以的!在此,笔者也不进行讲述,有想法的老铁!请自我思考!!