【C语言】代码实现杨氏矩阵中查找一个元素,时间复杂度小于O(N)

本文介绍了一种在杨氏矩阵中高效查找特定元素的方法。通过从矩阵的右上角或左下角开始比较,可以逐步缩小查找范围,实现时间复杂度低于O(N)的查找过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题,首先要直到杨氏矩阵是什么。

杨氏矩阵就是例如下面这样每一行每一列都是递增的矩阵。而在C语言中,我们可以把它定义为一个二维数组。只要把二维数组中每个值和目标值相比较,就能知道能不能找到这个元素。

1  2  3

4  5  6

7  8  9

然而题目还要求时间复杂度小于O(N),所以我们就不能一个一个的对比。

那我们可以发现,右上角和左下角的这两个数是最高效率的查找开始点。就用上边这个矩阵来举栗子吧~~

因为右上角的3是第一行里最大的元素,是第三列里最小的元素。而左下角的7又恰好是第三行最小的元素,是第一列最大的元素。我们为什么会选择这两个数来比较呢?是因为,假如我们选择3,那么将3与目标值进行比较,如果目标值大于3,就证明不在第一行,一下子砍掉了一行,如果小于3,就证明不在第三列,也能砍掉一列。这样子来循环比较是很高效的,最差也仅仅只需要查找5次即可知道结果。

用7来比较也是同样的道理。

然后就可以实现一个查找函数Find

在main函数里,调用自己定义的查找函数Find完成

写出代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

int Find(int a[3][3], int row, int col,int k)
{
	int x = 0;
	int y = col - 1;
	while (x<row&&y>=0)
	{
		if (a[x][y] < k)
			x++;
		else if (a[x][y]>k)
			y--;
		else
			return 1;
	}
}

int main()
{
	int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int k =7;
	int ret = Find(a,3,3,k);
	if (ret == 1)
		printf("找到了\n");
	else
		printf("找不到呀\n");

	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值