【C 剑指offer】有序整型矩阵元素查找 {杨氏矩阵}

2023-12-12 20:45

本文主要是介绍【C 剑指offer】有序整型矩阵元素查找 {杨氏矩阵},希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

        题目内容:

思路:

 图形演示:

 复杂度分析

 C源码:


/** *************************************************************************** ********************                                  ********************* ********************      COPYRIGHT INFORMATION       ********************* ********************                                  ********************* ***************************************************************************                                                                          **                                   _oo8oo_                                **                                  o8888888o                               **                                  88" . "88                               **                                  (| -_- |)                               **                                  0\  =  /0                               **                                ___/'==='\___                             **                              .' \\|     |// '.                           **                             / \\|||  :  |||// \                          **                            / _||||| -:- |||||_ \                         **                           |   | \\\  -  /// |   |                        **                           | \_|  ''\---/''  |_/ |                        **                           \  .-\__  '-'  __/-.  /                        **                         ___'. .'  /--.--\  '. .'___                      **                      ."" '<  '.___\_<|>_/___.'  >' "".                   **                     | | :  `- \`.:`\ _ /`:.`/ -`  : | |                  **                     \  \ `-.   \_ __\ /__ _/   .-` /  /                  **                 =====`-.____`.___ \_____/ ___.`____.-`=====              **                                   `=---=`                                ** *************************************************************************** ********************                                  ********************* ********************      				 ********************* ********************         佛祖保佑 永远无BUG       ********************* ********************                                  ********************* ***************************************************************************/


         整形二维数组内元素查找,简称“杨氏矩阵”,是《剑指offer》上的一道经典的题目。


 


         在之前的一篇文章中,我提出了一共三种解决问题的方法,分别是:

        遍历,二分查找,第三种并不成熟(也就是充分利用二分查找),为了纠正方法三,于是有了这篇文章。

       

        题目内容:

        有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

        要求:时间复杂度小于O(N);


思路:

        假设要找的元素为 7, 设为 key;

        我们观察到数组的每一行从左到右递增,每一列从上到下递增:

 

经过仔细分析:

         我们可以试着找到思路:

         

也就是说,我们把 未查找区域的右上角元素(记为a)与key比较;(意味着我们将从 row = 0,col = j -1 为初始值,然后开始判断)

        (记行为i,列为j)

        三种可能:

        a等于key——这是最简单也是最理想的情况,key就是最右上角元素,找到 于是返回 1 ;

        a大于key——由于每一列从上到下递增,a大于key说明最右边的一列都大于key,于是最右侧的一列抛弃,j--;

        a小于key——由于每一行从左到右递增,a小于key说明a的左边没有大于key的元素,于是第一行抛弃,i++;

        接下来,得到的仍然是矩阵,于是仍然可以用上述操作再次进行操作;但是需要对行 与 列 进行限制——row <= 最大行号,col >= 0;(根据 列号j-- ,但是不能小于0,行号 i++,但是不能越界访问 确定)

 图形演示:

        (红色框内代表舍弃)

初始状态:

 第一次比较:

 第二次比较:

第三次比较:

 

第四次比较: 

 

 

第五次比较:

 


 复杂度分析

         仅仅5次,就找到了key,其实,可以猜测,当矩阵为n阶方阵时,最坏需要比较(n-1)*2 次,才能得到结果——key在最左下角;或者key不存在。

        最坏的时间复杂度等于O(N),在一般情况下时间复杂度小于O(N),满足要求。

 C源码:


#include<stdio.h>
int Find_int(int arr[][4],int x,int y,int key)
{int i = 0;int j = y-1;//保证坐标的合法性while(i <= x && j >= 0){if( key==arr[i][j] ){return 1;//找到了}else if(arr[i][j] > key){j--;}else if(arr[i][j] < key){i++;}}return 0;//没有找到
}int main()
{int key = 0;scanf("%d",&key);int col = 4,row = 4;int arr[][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};int ret = Find_int(arr,row,col,key);printf("%d",ret);return 0;
}


 完~

转载请注明出处

这篇关于【C 剑指offer】有序整型矩阵元素查找 {杨氏矩阵}的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元