什么是杨氏矩阵?
杨氏矩阵,是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的。
有关的算法题
有这样一道题:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
解决这道题的基本思路要根据它的规律,右边和下边的比我大,左边和上面的比我小。很多人会想如果按照这样的规律查找,那么每一次不是有两种可能吗。
这种想法是没错的,但是如果从右上角开始或者从左下角开始,每一次只会有一种可能,因为从右上角开始的话,这个元素是这一行最大的,往左只能比他小,往下只能比他大;从左下角开始,这个元素是这一行最小的,往右只能比他大,往上只能比他小。
根据这个规律就可以写代码了:
int find_num(int(*arr)[5], int n, int row, int col)
{
//从右上角开始
/*int i = 0;
int j = col - 1;
while (j >= 0 && i < col)
{
if (arr[i][j] < n)
i++;
else if (arr[i][j]>n)
j--;
else
return 1;
}*/
//从左下角开始
int i = row - 1;
int j = 0;
while (i >= 0 && j < col)
{
if (arr[i][j] < n)
j++;
else if (arr[i][j]>n)
i--;
else
return 1;
}
return 0;
}
int main()
{
int arr[3][5] = { { 1, 2, 3, 4, 5 }, { 2, 3, 4, 5, 6 }, { 3, 4, 5, 6, 7 } };
int row = sizeof(arr) / sizeof(arr[0]);
int col = sizeof(arr[0]) / sizeof(arr[0][0]);
int n = 0;
scanf("%d", &n);
int ret = find_num(arr, n, row, col);
if (1 == ret)
printf("找到了\n");
else
printf("没找到\n");
return 0;
}