首先杨氏矩阵是每行按照升序排列并且每列按照升序排列的数组;
例如
{4,5,7}
{5,6,8}
{7,8,9}就是一个杨氏矩阵;
其次时间复杂度O(n)的意思就是将数组中的所有元素都遍历一遍,
代码实现:(时间复杂度等于O(n))
#include<stdio.h>
void text() {
//定义一个3*3的杨氏矩阵;
int arr[3][3] = {
{4,5,7},
{5,6,8},
{7,8,9}
};
int cow = 3, rol = 3;//定义行列;
int i = 0, j =0;//从第零行第零个开始查找
//输入查找元素;
printf("请输入要查找的元素:\n");
int input=0;
scanf("%d", &input);
//进行查找
for (i = 0; i < cow; i++) {
for (j = 0; j < rol; j++) {
if(arr[i][j]==input)
//输出查找到的位置;
printf("arr[%d][%d]=%d\n", i, j, input);
}
}
}
int main() {
text();
return 0;
}
下面我们用代码实现杨氏矩阵的元素查找(时间复杂度小于O(n)):
代码的解析请看注释;
#include<stdio.h>
void text() {
//定义一个3*3的杨氏矩阵;
int arr[3][3] = {
{4,5,7},
{5,6,8},
{7,8,9}
};
int cow = 3, rol = 3;//定义行列;
int i = 0, j = rol-1;//从第零行最后一个开始查找,i行j列
//输入查找元素;
printf("请输入要查找的元素:\n");
int input=0;
scanf("%d", &input);
//进行查找
while (i<=cow-1&&j>=0)
{
if (arr[i][j] > input)//比该列最小都小,则该列不可能有查找的元素
j--;//排除该列元素,查找前一列的
else if (arr[i][j] < input)//比该行最大的都大,则该行不可能有查找的元素
i++;//排除该行元素,查找前一行的
else {
//输出查找到的位置;
printf("arr[%d][%d]=%d\n", i, j, input);
//该行该列查到了,跳过该行该列
i++;
j--;
}
}
}
int main() {
text();
return 0;
}
如果有用的话请点个赞,谢谢✍~