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

2023-12-13 09:36

本文主要是介绍【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/487964

相关文章

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的