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

本文主要是介绍[C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,题目

遇到的一道算法题:

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:问题解决

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

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

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

 

这篇关于[C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658992

相关文章

Apache伪静态(Rewrite).htaccess文件详解与配置技巧

《Apache伪静态(Rewrite).htaccess文件详解与配置技巧》Apache伪静态(Rewrite).htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令,主要的... 一、.htAccess的基本作用.htaccess是一个纯文本文件,它里面存放着Apache服务器

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

一文详解如何在Python中使用Requests库

《一文详解如何在Python中使用Requests库》:本文主要介绍如何在Python中使用Requests库的相关资料,Requests库是Python中常用的第三方库,用于简化HTTP请求的发... 目录前言1. 安装Requests库2. 发起GET请求3. 发送带有查询参数的GET请求4. 发起PO

Python进行PDF文件拆分的示例详解

《Python进行PDF文件拆分的示例详解》在日常生活中,我们常常会遇到大型的PDF文件,难以发送,将PDF拆分成多个小文件是一个实用的解决方案,下面我们就来看看如何使用Python实现PDF文件拆分... 目录使用工具将PDF按页数拆分将PDF的每一页拆分为单独的文件将PDF按指定页数拆分根据页码范围拆分

Java中的Cursor使用详解

《Java中的Cursor使用详解》本文介绍了Java中的Cursor接口及其在大数据集处理中的优势,包括逐行读取、分页处理、流控制、动态改变查询、并发控制和减少网络流量等,感兴趣的朋友一起看看吧... 最近看代码,有一段代码涉及到Cursor,感觉写法挺有意思的。注意是Cursor,而不是Consumer

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

HTML5中下拉框<select>标签的属性和样式详解

《HTML5中下拉框<select>标签的属性和样式详解》在HTML5中,下拉框(select标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中选择值的方式,本文将深入探讨select标签的... 在html5中,下拉框(<select>标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中