【C语言】第五十七题⇢杨氏矩阵

170 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

🚩write in front🚩   

🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 星级博主~掘金⇿InfoQ~51CTOP创作者~周榜109﹣总榜860⇿全网访问量35w+🏅
🆔本文由 謓泽 发布到掘金(JueJin) 如需转载还请通知⚠
📝个人主页-謓泽 的个人主页 - 文章 - 掘金 (juejin.cn)📃
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏-【C语言】Topic - 謓泽的专栏 - 掘金 (juejin.cn)🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

 ✨第五十七题→杨氏矩阵✨

🤔题解思路如下👇
前言:坚持就是胜利✌我相信只要不断刷题一定会拥有成功的果实的,尽管过程很艰难。但是我们依旧要努力✊
⒈有一个数字矩阵,矩阵的每行从左到有都是递增的,矩阵从上到下是递增的。

说明⇢从这段话我们可以得知一个关键信息那么就是这道题目肯定是要用到二维数组的知识点的。   

⒉请编写程序在这样的矩阵中查找某个数字是否存在。

说明⇢从这段话中也可以得知一个比较重要的知识点从矩阵当中查找某个数字是否存在我们就需要创建一个变量k,这和之前我们写的一道冒泡排序查找k的数字很类似的。

⒊相关知识点

说明⇢时间复杂度小于O(N).表示的是线性阶,随着问题规模N的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

⒋解决方法

说明⇢查找每行右边的最大的数字如若不是就去掉一行,接着查找进行比较最后找那个数字,题目要求的是③行③列的即可。

1 2 3 
4 5 6
7 8 9

🍊注↔杨氏矩阵是非常经典的算法题目,难度比之前的题目会大一点。 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define Row 3
#define Col 3

void Print(int arr[Row][Col])
{
	int i;//行
	int j;//列
	for (i = 0; i < Row; i++)
	{
		for (j = 0; j < Col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
int Y_mate(int arr[Row][Col], int *pa, int *px, int k)
{
	int x = 0;//行
	int y = *px - 1;//列
	while (x < Row && y >= 0)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
		{
			*pa = x;
			*px = y;
			return 1;//找到了
		}
	}
	return 0;//没找到
}
int main(void)
{
	int arr[Row][Col] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
	printf("杨氏矩阵:↓\n");
	Print(arr);
	printf("请输入找到K的元素:");
	int input = 0;
	scanf("%d", &input);
	int a = 3;// 行 1.带入参数
	int b = 3;// 列 2.带回值
	int ret = Y_mate(arr, &a, &b, input);
	if (ret == 1)
	{
		printf("找到了--->下标:%d %d\n", a, b);
	}
	else
	{
		printf("没找到!\n");
	}
	return 0;
}

可能会输入的运行结果🖊 杨氏矩阵:↓
1  2  3 
4  5  6 
7  8  9
请输入你要查找K的元素:5
找到了 ---> 下标:1 1
用一幅图来表示上面的代码的思路↓
最后⇢这道题目的讲解也就到此结束了,不知道你学会了没有。学会了Q1没学会的Q👁