杨氏矩阵

本文介绍了如何利用杨氏矩阵的递增特性设计一个高效的查找算法,通过C语言实现查找特定数字的坐标,时间复杂度为O(m+n)。给出示例代码并展示了实际运行结果。
摘要由CSDN通过智能技术生成

1.概念:

矩阵的每行从左到右是递增的,矩阵从上到下是递增的

eg:4*4的数组(该阵就为杨氏矩阵)

2.相关代码题:

eg:假如有一个4(i)*4(j)数组(如上图),请编写程序在杨氏矩阵中查找某个数字是否存在。如若存在,则打印出坐标,否则打印没有找到。

(1)分析:

假如查找14(key)是否存在(i:行,j:列)

 我们可以从该二维数组的第一行的最后一个元素,开始来与所查找的数进行对比,比key(14)大就向下移-->i++,否则向左移-->j--。如果遍历完整个数组都没有找到的话(所查找的元素在数组范围外),就没有找到(如若从数组的第一个元素开始遍历比较这样会比较费时,向刚才的那样写下来的时间复杂度为m(行) + n(列))

(2)代码实现:

#include <stdio.h>
#include <stdlib.h>
int* Yangsearch(int arr[4][4], int key)
{
	int* ret = (int*)calloc(2, sizeof(int));
	if (ret == NULL)
	{
		perror("calloc");
	}
	int i = 0;
	int j = 0;
	while (arr[i][3 + j] != key)
	{
		if (arr[i][3 + j] < key)
		{
			i++;
		}
		else
		{
			j--;
		}
		if (i < 0 || j > 4 - 2 || i > 4 + 1 || 3 + j < 0) //查找元素在数组以外,就是没找到
		{
			return NULL;
		}
	}
	ret[0] = i;
	ret[1] = 3 + j;
	return ret;
}
int main()
{
	int arr[4][4] = { {1,5,7,9},{4,6,10,15},{8,11,12,19},{14,16,18,21} };
	int key = 0;
	scanf("%d", &key);
	int i = 0;
	int* p = Yangsearch(arr, key);
	if (p == NULL)
	{
		printf("没有找到!");
	}
	else
	{
		printf("找到了!位置为:\n");
		for (i = 0; i < 2; i++)
		{
			printf("%d ", *(p + i));
		}
	}
	
	return 0;
}

 (3)实际运行结果:

 输入14,找到了并且返回它的位置。

 输入17,没有找到!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值