栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言】杨氏矩阵

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言】杨氏矩阵

文章目录
  • 题目
  • 一、思路
  • 二、代码实现


题目

杨氏矩阵:是一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下也是递增的。如:
1 2 3
4 5 6
7 8 9
请编写程序在这样的矩阵中查找某个数字是否存在。要求时间复杂度小于O(N);

一、思路

1.题目要求时间复杂度小于O(N),所以不能用遍历的算法

2.根据杨氏矩阵的特点,从左到右递增,从上到下递增,我们以上述的杨氏矩阵为例,如果要查找的是数字7,我们写出以下逻辑:右上角的元素arr[0][2]==3小于7,但3是第一行最大的元素,所以7不可能在矩阵的第一行(x为0),那么排除第一行,所查找的范围缩小到行数x为1和2。这时右上角的元素变成6,7比6大,而6是第二行最大的元素,所以排除第二行,范围缩小到只剩最后一行,现在右上角的元素是9,比7大,9是第三列最大的元素,排除,剩8,是第二列最大的元素排除,列–,最后就找到7了。

3.我们要把找到的数字的下标带回去,所以传址操作。

二、代码实现
#include
int find_num(int arr[3][3], int k, int* px,int* py)
{
	//1.找出右上角元素
	int x = 0;
	int y = *py - 1;
	while (x<=*px-1&&y>=0)
	{
		if (arr[x][y] > k)
		{
			y--;
		}
		else if (arr[x][y] < k)
		{
			x++;
		}
		else
		{
			*px = x;
			*py = y;
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	int x = 3;
	int y = 3;
	int k;
	scanf("%d", &k);
	int ret = find_num(arr, k, &x, &y);//传址操作,带回下标
	if (ret == 1)
	{
		printf("找到了,下标是%d %dn", x, y);
	}
	else
	{
		printf("找不到n");
	}
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1009849.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号