【C语言练习——杨氏矩阵】


前言

有一个数字矩阵,矩阵的每行从左到右是递增的,每一列从上到下也是是递增的,请在此矩阵中查找是否存在某个数字


1、杨氏矩阵是什么?

杨氏矩阵的定义:
在这里插入图片描述
例如:一个简单的3阶杨氏矩阵

在这里插入图片描述
杨氏矩阵有两个显著的特点:

  • 矩阵的每行从左到右是递增的
  • 每一列从上到下也是是递增的

在这里插入图片描述

2、方法 1

在学完C语言基础阶段的循环、数组、函数相关的知识点后,可以写出最基础的方法:

  • 遍历数组的每一个元素
  • 判断是否与查找的数字相等
//时间复杂度O(N^2)
void findnum(int a[][3], int  num, int hang, int lie)
{
	int i = 0;
	int j = 3;
	for (int i = 0; i < hang; i++)//遍历数组
	{
		for (int j = 0; j < lie; j++)
		{
			if (a[i][j] == num)
			{
				printf("下标是 %d %d\n", i, j);
				return;
			}
		}
	}	
	printf("没有找到数字\n");
}
int main()
{
	int a[][3] = { {1,2,3},
				   {4,5,6},
				   {7,8,9} };
	int num = 8;//要寻找的饿数字
	int hang = sizeof(a) / sizeof(a[0]);//数组行数
	int lie = sizeof(a[0]) / sizeof(a[0][0]);//数组列数
	findnum(a, num, hang, lie);
	return  0;
}

结果见下图:

在这里插入图片描述

3、方法 2

在学过【初阶数据结构与算法 1】时间复杂度与空间复杂度(1) 后,可值方法1 的时间复杂度,最坏的情况是O(N^2),因此,可以对方法1优化,要充分利用杨氏矩阵的特点,无需遍历每一个元素:

  • 以每一行或每一列为单位进行搜索,先从右上角开始搜索,
  • 当右上角的数字大于查找数字,则查找数字位于左侧
  • 当右上角的数字小于查找数字,则查找数字位于下侧
void findnum(int a[][3], int  num)
{
	int i = 0;
	int j = 3;
	while (i<=2 && j>=0 )//循环的限制条件
	{
		if (a[i][j - 1] < num)//从右上角开始查找 
		{
			i++;//第一行最大比num小,跳到下一行
		}
		else  if (a[i][j - 1] > num)
		{
			j--;//第一行最大比num大,行不动,列左移 
		}
		else
		{
			printf("下标是 %d %d\n", i, j-1);
			return;
		}
	}	
	printf("没有找到数字\n", i, j - 1);
}
int main()
{
	int a[][3] = { {1,2,3},
				   {4,5,6},
				   {7,8,9} };
	int num = 8;//要寻找的饿数字
	findnum(a, num);
	return  0;
}

方法 2 将时间复杂度优化为O(n),查找速度较快,结果见下图:

在这里插入图片描述


总结

C语言还需要多练习,不管自己写的代码是罗嗦了,还是太烂了,也必须要写完,实现题目要求,这是最重要的一步。

第二步就是多看看别人写的代码,学习别人的思路,记录下来写成博客,方便自己复习。

熟能生巧!

  • 52
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 46
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初学C语言者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值