[C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!

news2024/11/19 6:14:15

一,题目

遇到的一道算法题:

1,已知有一个数字矩阵(row行,col列),矩阵的每行 从左到右 递增,每列 从上到下 递增。

2,现输入一个数字  num  ,判断数字矩阵中是否存在该元素,若存在,求出此数字在矩阵的哪一行,哪一列?(求出其中一组行列即可)

3,要求:时间复杂度小于O(N)。

二,简介杨氏矩阵

此题目中的矩阵也叫做杨氏矩阵,通常可以用二维数组来表示。

杨氏矩阵画图举例:

解决此题并不需要深刻理解杨氏矩阵。

但若有需要,杨氏矩阵详解链接附上:杨氏矩阵 - OI Wiki (oi-wiki.org)

三,各种解法(时间复杂度的详解)以及思考

3.1:暴力遍历

   3.1.1:详解代码

for (int i = 0; i < row; i++)
{
	for (int j = 0; j < col; j++)
	{
		if (Y_arr[i][j] == search)
		{
			printf("%d %d\n", i, j);
		}
	}
}

   3.1.2:时间复杂度分析

   最坏的情况下,此方法的时间复杂度为 O(rwo * col)

   不符合题目要求。

   优化!

3.2:对每行元素进行二分查找

   3.2.1:在代码中具体分析!

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define NUM 10
int main()
{
	int Y_arr[NUM][NUM] = { 0 };
	int row = 0;
	int col = 0;
	//输入行 列
	scanf("%d %d", &row, &col);
	//输入数组中的元素
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			scanf("%d", &Y_arr[i][j]);
		}
	}

	//输入要查找的数
	int search = 0;
	scanf("%d", &search);
	//开始查找
	
	for (int i = 0; i < row; i++)
	{
		int left = 0;
		int right = col - 1;
		while (left <= right)
		{
			int mid = left + (right - left) / 2;
			if (Y_arr[i][mid] < search)//中数小于要查找的数,更新左下标,缩小范围
			{
				left = mid + 1;
			}
			else if (Y_arr[i][mid] > search)//中数大于要查找的数,更新右下标,缩小范围
			{
				right = mid - 1;
			}
			else//找到了
			{
				printf("要查找的数的行下标是 %d , 列下标是 %d\n", i, mid);
				return 0;
			}
		}
	}
	printf("找不到\n");
	return 0;
}

   3.2.2:时间复杂度分析

   最坏的情况下,此方法的时间复杂度是 O( row * log(col) )

   仍不符合题目要求。

   再优化!

3.3:定位查找法

   3.3.1:规律总结

      每次从右上角开始查找:

      Ⅰ:若要查找的数大于每次的右上角的数,就更新行数。

      Ⅱ:若要查找的数小于每次的右上角的数,就更新列数。

   3.3.2:画图分析 | 模拟查找

   

   3.3.3:代码解决

   

​
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define NUM 10
int main()
{
	int Y_arr[NUM][NUM] = { 0 };
	int row = 0;
	int col = 0;
	//输入行 列
	scanf("%d %d", &row, &col);
	//输入数组中的元素
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			scanf("%d", &Y_arr[i][j]);
		}
	}

	//输入要查找的数
	int search = 0;
	scanf("%d", &search);
	//开始查找
	int temp_row = 0;
	int temp_col = col - 1;
	while (temp_row < row && temp_col >= 0)
	{
		if (Y_arr[temp_row][temp_col] > search)
		{
			temp_col -= 1;
		}
		else if (Y_arr[temp_row][temp_col] < search)
		{
			temp_row += 1;
		}
		else
		{
			printf("要查找的数的行下标是 %d , 列下标是 %d\n", temp_row, temp_col);
			return 0;
		}
	}
	printf("找不到\n");
	return 0;
}

​

   3.3.4:时间复杂度分析

   最坏的情况下,此方法的时间复杂度为 O( row + col ).

   符合题目要求。

   完美!!!

四,总结

4.1:问题解决

   Ⅰ,同一种问题的解决,可能会使用多种方法,尽我们所能地使用最优解,这是再好不过了。    

   Ⅱ,不断地优化代码,不断地学习新方法,时时刻刻在进步

   Ⅲ,欢迎分享,感谢阅读!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1419100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

防御保护常用知识

防火墙的主要职责在于&#xff1a;控制和防护 --- 安全策略 --- 防火墙可以根据安全策略来抓取流量之 后做出对应的动作 防火墙分类主要有四类&#xff1a; 防火墙吞吐量 --- 防火墙同一时间能处理的数据量多少 防火墙的发展主要经过以下阶段&#xff1b; 传统防火墙&#xf…

报错“MySql配置文件已损坏,请联系技术支持”的解决方法

目录 第一步 打开控制面板&#xff0c;选择管理工具&#xff0c;再选择事件查看器 第二步 在【应用程序】里找到这条报错&#xff0c;记下来文件内容。我自己的来源是“MsiInstaller” 第三步 winR组合键&#xff0c;输入regedit打开注册表 第四步 根据前面报错的文件名定位…

【Python笔记-设计模式】抽象工厂模式

一、说明 (一) 解决问题 抽象工厂是一种创建型设计模式&#xff0c;主要解决接口选择的问题。能够创建一系列相关的对象&#xff0c;而无需指定其具体类。 (二) 使用场景 系统中有多于一个的产品族&#xff0c;且这些产品族类的产品需实现同样的接口。 例如&#xff1a;有…

仅使用 Python 创建的 Web 应用程序(前端版本)第10章_订单列表

本章我们将实现订单列表页面。 完成后的图像如下。 创建过程与之前相同,如下。 No分类内容1Model创建继承BaseDataModel的数据类Order、OrderDetail2Service创建一个 OrderAPIClient3Page定义PageId并创建继承自BasePage的页面类4Application将页面 ID 和页面类对添加到 Mult…

春节寄快递贵?想要便宜寄快递?那是你没找到寄快递便宜的渠道!

春节将至&#xff0c;公司会发放一大批的年货礼品给员工们&#xff0c;来聊表这一年来的勤恳工作的心意。但是想要拿走这么多的年货&#xff0c;可不是一件容易的事情啊&#xff0c;这时候我们可以通过邮寄的方式把东西邮寄走&#xff0c;是不是省了很多事呢&#xff0c;不仅回…

Unity之动画和角色控制

目录 &#x1f4d5; 一、动画 1.创建最简单的动画 2.动画控制器 &#x1f4d5;二、把动画和角色控制相结合 &#x1f4d5;三、实现实例 3.1 鼠标控制角色视角旋转 3.2 拖尾效果 &#x1f4d5;四、混合动画 最近学到动画了&#xff0c;顺便把之前创建的地形&#xff0…

uniapp实现页面左滑右滑切换内容

uniapp uview&#xff1a;使用uniapp的swiper和uview的tabs标签组合实现 Tabs 标签 | uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架 vue <template> <view class"main"> <view class""> …

Spring中用Mybatis注解查询映射多个对象

1.映射写法如下 SelectProvider(type UserGroupMapper.class, method "getOrigins")Results({Result(property "id", column "id"),Result(property "groupId", column "groupId"),Result(property "resId&qu…

C#,打印漂亮杨辉三角形(帕斯卡三角形)的源代码

杨辉 Blaise Pascal 这是某些程序员看完会哭的代码。 杨辉三角形&#xff08;Yanghui Triangle&#xff09;&#xff0c;是一种序列数值的三角形几何排列&#xff0c;最早出现于南宋数学家杨辉1261年所著的《详解九章算法》一书。 欧洲学者&#xff0c;最先由帕斯卡&#x…

老龄化对投资意味着什么?

1月15日&#xff0c;国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措&#xff0c;为我国首个以“银发经济”命名的政策文件。 近期&#xff0c;国信证券分析师王开发布题为《银发经济再思考&#xff1a;老龄化对投资的影响》的报告&#xff0…

使用this调用兄弟构造器

在任意类的构造器中&#xff0c;都可以通过this(...)去调用该类的其他构造器。 假如说只给有参构造器传了两个参数&#xff0c;想让第三个参数有默认值&#xff0c;那么可以这样&#xff1a; 可以看出有一部分代码重复了&#xff0c;那么可以通过this()优化&#xff1a; 这样可…

202412读书笔记|《做自己的花》——走自己的路,成为自己的星星

202412读书笔记|《做自己的花》——走自己的路&#xff0c;成为自己的星星 《做自己的花&#xff08;微信读书联合出品&#xff09;》作者月芽&#xff0c;一个用画画和诗讲故事的插画师、诗人。 画风治愈&#xff0c;故事感强&#xff0c;擅长在童话般的故事中描绘现实温暖的心…

js实现贪吃蛇

文章目录 实现方法_11实现效果2 实现步骤2.1 移动场地2.2 游戏难度2.3 造蛇和食物2.4 蛇的移动2.5 产生食物的随机位置 3 全部代码 实现方法_21 实现效果2实现想法2.1 蛇的存储和显示2.2 蛇的移动(重难点)2.3 吃食物 3 完整代码 实现方法_1 1实现效果 2 实现步骤 html部分忽略…

酒鬼酒2024年展望:稳发展动能,迈入恢复性增长轨道

文 | 琥珀酒研社 作者 | 渡过 最近几个月来&#xff0c;白酒估值回落到近十年来低位&#xff0c;反映出了整个白酒行业的市场低迷和虚弱现状。不管是头部企业五粮液、泸州老窖&#xff0c;还是区域酒企口子窖、金种子酒等&#xff0c;最近都通过“回购”或“增持”&#xff0…

python之组合数据类型-列表

列表操作 列表增删改查列表增加元素的方法列表删除元素的方法列表修改元素的方法列表查找元素的方法 列表其他常用方法列表的切片用法列表修改排序的方法列表的常用符号、常用函数 列表是什么&#xff1f; 列表是有序集合&#xff0c;列表可以一次性存储几个或几万个元素&#…

【安装指南】HBuilder X 下载、安装详细教程

目录 &#x1f33a;1. 概述 &#x1f33b;2. HBuilder X 安装包下载 &#x1f33c;3. 安装详细教程 &#x1f33a;1. 概述 HBuilder X 是一款由DCloud开发的基于Electron框架的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Web和移动应用程序的开发。以下是…

表贴式PMSM的直接转矩控制(DTC)MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 表贴式PMSM的直接转矩控制(DTC),直接使用滞环控制对转矩和磁链进行控制&#xff0c;相对于传统的FOC控制而言&#xff0c;其不需要进行解耦变换&#xff0c;在此次的有以下几点需要注意&#xff1a…

uniCloud ---- JQL语法 连表查询

目录 JQL数据库操作 JQL流程图解 JQL的限制 单表查询 联表查询 新增 修改 删除 联表查询 例子 字段过滤field 字段别名as 限制查询记录的条数limit 只查一条记录getone JQL数据库操作 JQL&#xff0c;全称 javascript query language&#xff0c;是一种js方式操…

Chapter 8 - 1. Congestion Management in TCP Storage Networks

This chapter covers the following topics. 本章包括以下主题。 Understanding congestion in TCP storage networks. Detecting congestion in TCP storage networks. Traffic patterns with iSCSI and NVMe/TCP and correlation with network congestion. Preventing co…