杨氏矩阵,是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);
例:
1 2 3
4 5 6
7 8 9
在这个杨氏矩阵中查找7。
思路:矩阵右上角的值,是所在行最大值,所在列最小值。用矩阵右上角的数字与要查找的值k相比较。若k小于矩阵右上角的值,排除所在列,列号-1继续比较。若k大于矩阵右上角的值,排除所在行,行号+1。依次类推,若找到返回1,没找到返回0。
#include <stdio.h>
int find_num2(int arr[3][3], int* px, int* py, int key) {
int x = 0;//行
int y = *py - 1;//列
while (x < *py && y >= 0) {
if (arr[x][y] < key) {
x++;
}
else if (arr[x][y] > key) {
y--;
}
else {
*py = y;
*px = x;
return 1;
}
}
return 0;
}
int main() {
//杨氏矩阵
//有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的
//编写程序在这样的矩阵中查找某个数字是否存在
//要求:时间复杂度小于O(n)
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
//查找一个数字,例:7
int k = 7;
int x = 3, y = 3;
//int ret=find_num1(arr, 3, 3, k);
int ret=find_num2(arr, &x, &y, k);
if (1 == ret) {
printf("找到了!\n");
printf("下标是%d,%d\n", x, y);
}
else {
printf("没找到。");
}
return 0;
}
运行结果: