常见面试题:二维递增数组的快速查找,复杂度(M+N-2),M,N分别为数组的行数和列数

本文主要是介绍常见面试题:二维递增数组的快速查找,复杂度(M+N-2),M,N分别为数组的行数和列数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:一个二维数组,按行按列都是递增的,要求程序在尽可能小的复杂度的情况下查找给定的元素。

例如:a[4][5]={
         {1, 3, 7, 11, 19},
         {2, 7, 10, 29, 30},
         {13, 28, 54, 69, 90},
         {46, 57, 78, 98, 101}
     }查找29,返回其下标(1,3)。

思路:需要充分利用数组的特点,按行按列都是递增的,这样才能减小复杂度。

下面就找一下特点喽,按行按列递增这是最明显的,还有隐含一点的就是,左上角和右下角分别是最小和最大的元素。恩,对的。哪还有呢?我们需要的是简便算法呀!继续看的话会发现,一列的最大元素在对应的最后一行,(废话),一行的最小一个在最左边。如果一个元素比一列的最下面一个元素还大的话,那它就一定不在这一列。诶,有点眉目了。如果要查找的元素比第一列的最下面一个元素还大的话,那它一定在之后的数组中。同理,目标如果比这个元素小的话,那它一定不在此行,且在上面的几行里。哈哈,数组又缩小了。然后,我们每次都能排除一行或一列,最难找的那个元素就是右上角的了。那它的复杂度是多少那?折线走过去,就是M-1+N-1,对啊,线性哎,不错1

//c语言
#include <stdio.h>
/*a是按行按列均递增的数组,该函数实现在数组中找出目标数据的下标,M和N表示数组的行数和列数*/
/*注:未考虑数组合法与否,返回的是数组的下标*/
int getIndexofIncArray(int *a, int M, int N, int target, int *x, int *y){int i=0, j = M-1, count;//找不到元素的话返回-1,找到的话返回0,i表示列*x = *y = -1;//初始化for(count=0; count<N+M;count++){printf("第%d次访问:%d\n",count, *(a + N*j + i));if(target == *(a + N*j + i)){*x = j;*y = i;return 0;}else	if(target > *(a + N*j + i)){//目标大于,右移if((i >= N) && (j < 0)){break;}else{i++;}}else{if((i >= N) && (j < 0)){break;}else{//目标小于,上移j--;}}}return -1;
}void  main(){int i, j;int *p1 = &i, *p2 = &j;int a[4][5]={{1, 3, 7, 11, 19},{2, 7, 10, 29, 30},{13, 28, 54, 69, 90},{46, 57, 78, 98, 101}};getIndexofIncArray(&a[0][0], 4, 5, 19, p1, p2);printf("%d, %d", i, j);getchar();
}


这篇关于常见面试题:二维递增数组的快速查找,复杂度(M+N-2),M,N分别为数组的行数和列数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

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

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

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

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

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

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo