【感悟《剑指offer》典型编程题的极练之路】01数组篇!

                                        ​​​​​​​        ​​​​​​​                                个人主页:秋风起,再归来~

                                           ​​​​​​​                    文章所属专栏:《剑指offer》典型编程题的极练之路        ​​​​​​​        ​​​​​​​        ​​​​​​                                     

                                                                        个人格言:悟已往之不谏,知来者犹可追

                                                                     ​​​​​​​                   克心守己,律己则安!

目录

​编辑

一、面试题1:数组中重复的数字(查重)

1.1 题目一:找出数组中重复的数字

1.2 题目二:不修改数组找出重复的数字

二、面试题2:二维数组中的查找

  三. 完结散花


一、面试题1:数组中重复的数字(查重)

1.1 题目一:找出数组中重复的数字

题目描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1

数据范围:0≤n≤10000 

进阶:时间复杂度 O(n) ,空间复杂度O(n) 

示例:

输入:
[2,3,1,0,2,5,3]
返回值:
2
说明:
2或3都是对的 

牛客网上该题目链接(点击进入)

1.1.1排序法

解决这个问题我们首先可以想到一个非常简单的方法就是把数组进行排序,从有序的数组中找出重复的元素是一件很容易的事情,只需要从头到尾扫描排序后的数组就可以了。排序一个长度为n的数组需要O(nlongn)的时间

1.1.2 哈希表

我们还可以用哈希表来解决这个问题。从头到尾按顺序扫描数组的每个数字,每扫描到一个位置的时候,都可以用O(1)的时间来判断哈希表里是否已经包含了该数字。如果哈希表里还没有这个数字,就把他加入哈希表。如果哈希表里已经存在该数字,就找到一个重复的数字。这个算法的时间复杂度是O(n),但它提高效率是以一个大小为O(n)的哈希表为代价的。

1.1.3 下标索引

我们注意到数组中的数字都在0~n-1的范围内。如果数组中没有重复的数字,那么排序后数字i将出现在下标为i的位置由于数组中有重复的数字,有些位置可能存在多个数字,同时有些位置可能没有位置。

现在我们重新排列一下这个数组。从头到尾依次扫描数组中的每一个数组,当扫描到下标为i的数字(m)时如果这个数字等于i(m=i),则我们接着扫描下一个数字如果不是,那我们就把它(m)和下标为m的那个元素先进行比较,如果m与下标为m的元素的大小相等,那这个数(m)就是重复的数字,如果不相等,那我们就将这两个数字进行交换(即把m放到下标为m的位置)。接下来我们就重复这个比较交换的动作,直到我们发现一个重复的数字。

画个图理解一下:

牛客网上解题的代码如下~

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param numbers int整型一维数组 * @param numbersLen int numbers数组长度* @return int整型*/
int duplicate(int* numbers, int numbersLen ) {// write code hereif(numbers==NULL||numbersLen<=0)return -1;//第一层循环遍历数组元素for(int i=0;i<numbersLen;i++){//第二层循环将该元素放到和其值相等的下标的位置while(numbers[i]!=i){if(numbers[i]==numbers[numbers[i]]){return numbers[i];}int tmp= numbers[i];numbers[i]=numbers[tmp];numbers[tmp]=tmp;}}return -1;
}

代码中尽管有两重循环,但每个数字最多只要交换两次就能找到属于他自己的完位置,因此总的时间复杂度为O(n)。另外,所有的操作都是在原数组上完成的,不需要分配额外的内存空间,所以空间复杂度为O(1)。

1.2 题目二:不修改数组找出重复的数字

题目描述:

在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。

例如:如果输入长度为8 的数组{2,3,5,4,3,2,6,7},那么对应输出的是重复的数字是2或3。

1.2.1 创建临时数组

不能修改临时数组,那我们就创建一个临时的大小为n+1的数组,将原数组中数字为m的元素复制放到临时数组下标为m的位置上,在放入之前我们比较一下它们的值是否相等就可以很容易的找到重复的数字了。不过我们创建了一个大小为n+1的数组,所以这种算法的空间复杂度为O(n),时间复杂度也是O(n)。

那我们接下来就尝试避免使用O(n)的空间看能不能解题~

1.2.2 二分查找

我们假设数组中没有重复的数字,那么对于1~n范围内的数字,我们在遍历原数组后,这些数字出现的次数一定为n但如果原数组中有重复的数字并且在1~n内存在原数组中重复的数字,我们在遍历原数组后,这些数字出现的次数一定大于n。

所以,基于以上的分析,我们不妨借鉴二分查找法的思路将将我们要查重的数据一分为二来查找。

下面举一个栗子进行分析啦~

代码实现如下~

int countrange(int*numbers,int numbersLen,int start,int middle){int count=0;for(int i=0;i<numbersLen;i++){if(numbers[i]>=start&&numbers[i]<=middle){count++;}}return count;}
int duplicate(int* numbers, int numbersLen ) {// write code hereif(numbers==NULL||numbersLen<=0)return -1;int start=0;int end=numbersLen-1;while(start<=end){int middle=((end-start)>>1)+start;//计算局部范围内数字出现的次数int count=countrange(numbers,numbersLen,start,middle);if(start==end)//找到最后一个数{if(count>1)return start;elsebreak;}if(count>(middle-start+1))//前半段有重{end=middle;}else //后半段有重{start=middle+1;}}return -1;
}

需要指出的是上述代码按照二分查找的思路,如果输入长度为n的数组,那么函数countrange将被调用O(logn)次,每次需要O(n)的时间,因此总的时间复杂度为O(nlogn),空间复杂度为O(1)。和前面提到的需要O(n)的辅助空间的算法相比,这种算法相当于以时间换空间

二、面试题2:二维数组中的查找

题目描述:

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

力扣上的题目链接(点击进入)

在具有上述特性的矩阵中搜索目标值的问题可以使用一种高效的算法来解决,这种算法的时间复杂度为O(m + n)这个算法的基本思想是,从矩阵的右上角或左下角开始搜索,然后利用矩阵的特性来决定下一步的搜索方向。

以下是基于右上角开始搜索的算法步骤:

  1. 初始化一个指针,指向矩阵的右上角元素(即第一行最后一列的元素)。
  2. 比较当前指针指向的元素与目标值的大小:
    • 如果当前元素等于目标值,则搜索成功,返回该元素的位置。
    • 如果当前元素大于目标值,由于矩阵的每一列都是升序排列的,因此目标值不可能在当前列的更下方位置,所以将指
    • 针向左移动一列。
    • 如果当前元素小于目标值,由于矩阵的每一行都是升序排列的,因此目标值不可能在当前行的更左侧位置,所以将指针向下移动一行。
  3. 重复步骤2,直到找到目标值,或者指针移出矩阵的范围(即指针指向的行列号超出矩阵的边界)。如果指针移出矩阵范围仍未找到目标值,则搜索失败,返回相应的结果。

解题的具体代码如下~

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){if(matrix==NULL||matrixSize<=0)return false;int row=0;//从第0行int col=(*matrixColSize-1);//从最后一列while(row<matrixSize&&col>=0){if(matrix[row][col]==target)return true;else if(matrix[row][col]<target)row++;elsecol--;}return false;
}

  三. 完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

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

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

相关文章

内网横向1

IPC$详解 IPC( Internet Process Connection) 共享 “ 命名管道 ” 的资源 , 是为了实现进程间通信而开放的命名管道。 IPC 可以通过验证用户名和密码获得相应的权限&#xff0c;通常在远程管理计算机和查看计算机的共享资源时使用 通过 ipc$ &#xff0c;可以与目标机器建立连…

第六十一回 放冷箭燕青救主 劫法场石秀跳楼-编译安装飞桨paddlepaddle@openKylin+RISCV

卢俊义在水里被张顺抓住&#xff0c;用轿子抬到了梁山。宋江等人下马跪在地上迎接&#xff0c;请他坐第一把交椅。卢俊义宁死不从&#xff0c;大家只好说留他在山寨几天&#xff0c;先让李固带着马车货物回去。吴用对李固说&#xff0c;你的主人已经答应坐第二把交椅了&#xf…

安科瑞智能断路器产品介绍【可监可控 远程操控 短路保护】

开发背景 过去几年智慧用电的产品应用中&#xff0c;大多数只安装于进线测。主要存在以下几个问题&#xff1a;难定位&#xff0c;不知道具体哪个回路出线问题&#xff0c;排查困难&#xff1b;出线过载或线缆温度过高无法知晓&#xff1b;即使是出线回路安装了的场景&#xf…

Vue3 依赖注入provide与inject

简介 关于provide与inject下面是vue官网上的一些介绍 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用props。想象一下这样的结构&#xff1a;有一些多层级嵌套的组件&#xff0c;形成了一颗巨大的组件树&#xff0c;而某个深层的子组件需要一个…

HarmonyOS卡片刷新服务,信息实时更新一目了然

如今衣食住行娱乐影音等App占据了大多数人的手机&#xff0c;一部手机可以满足日常大多需求&#xff0c;但对需要经常查看或进行简单操作的场景来说&#xff0c;总需要用户点开App操作未免过于繁琐。 针对该问题&#xff0c; HarmonyOS SDK为用户提供了Form Kit&#xff08;卡…

ARM64汇编07 - 访存指令

访存指令是ARM64汇编语言中的一部分&#xff0c;涵盖了数据访问和内存操作的指令。这些指令使处理器能够与内存进行交互&#xff0c;包括读取数据、写入数据以及执行其他内存相关的操作。理解这些指令对于理解处理器如何与内存交互以及如何管理数据至关重要。 访存指令介绍两个…

ChatGPT又要更新了?GPT-5发布时间确定!

在K-Startup-OpenAI Match Day活动上&#xff0c;OpenAI CEO萨姆奥特曼(Sam Altman)首次公开肯定了GPT-5的潜力。他指出&#xff0c;GPT-5不仅会带来显著的进步&#xff0c;更将在高级推理功能上实现一次前所未有的飞跃&#xff0c;打破外界对于其仅是渐进式提升的误解。 同时现…

开源表单设计器颗粒度级别控制表单的显示条件原理分析

表单渲染中, 有些表单的显示有不同条件, 比如需要上一个表单的开关打开,或者文本内容为 xxxx, 或者需要大于或等于或小于指定值, 或者需要选中某个选项, 或者需满足以上多个条件或在满足多个条件中的一个, 有 n 种场景选择, 这样就需要条件显示配置功能, 来满足多样化需求 预览…

【干货】Java开发者快速上手.NET指南

前言 前几天有小伙伴在技术群里发了一个微软官方出的&#xff1a;适用于Java开发人员的.NET快速入门免费电子书&#xff0c;今天大姚来分享一下Java开发者想要快速上手.NET有哪些教程和优质资料。 微软适用于Java开发人员的.NET快速入门指南 下载阅读地址&#xff1a;适用于 …

(基础)AJAX概念和axios使用、URL、请求方法和数据提交、HTTP协议、接口、form-serialize插件

AJAX概念和axios使用 AJAX概念 AJAX就是使用XMLHttpRequest对象与服务器通信&#xff0c;它可以使用JSON、XML、HTML和text文本等格式发送和接收数据&#xff0c;AJAX最吸引人的就是它的异步特性&#xff0c;也就是说它可以在不重新刷新页面的情况下与服务器通信&#xff0c;…

windows10装windows11的CMD(Terminal)终端

文章目录 一 前言二 安装Terminal三 启动设置成默认启动cmd 一 前言 我装了WSL的LINUX系统&#xff0c;在 windows10 系统下面不方便启动linux&#xff0c;但是Windows11 在cmd 里面就可以打开&#xff0c; 所以找了这个方法 二 安装Terminal 先在windows10微软的商城(Microso…

>>Vue3+pinia+echarts等实现疫情可视化大图

一.>>前言 1.这个项目是在小满实战篇可视化&#xff08;第九章-饼图&#xff09;_哔哩哔哩_bilibili 这一系列课程为基础来做的&#xff0c;真的很感谢小满老师&#xff0c;讲的内容干货满满&#xff0c;暂时解决了手上没有项目的难题。大家可以去观摩一下他的优质课程。…

什么是膨胀卷积/空洞卷积

什么是膨胀卷积/空洞卷积 膨胀卷积&#xff08;Dilated Convolution/Atrous Convolution&#xff09;&#xff08;下面都使用膨胀卷积 这个名词&#xff09; 先来一张图&#xff0c;让大家对于膨胀卷积有个直观的理解&#xff0c;上图左边就是普通卷积&#xff0c;右边是膨胀卷…

外包干了14天,技术退步明显。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了成都一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

京东按图搜索京东商品(拍立淘) API 返回值说明

京东按图搜索商品&#xff08;拍立淘&#xff09;的API返回值包含了关于通过图片搜索到的京东商品的相关信息。由于我无法提供最新的京东API返回值的确切结构&#xff0c;以下是基于常见API设计原则的一个大致的返回值示例和说明&#xff1a; 调用链接获取详情 item_search_i…

MC10T1S-10BASE-T1S车载以太网转换器

10BASE-T1S车载以太网转换器 为10BASE-T1S车载以太网转换器&#xff0c;支持Multidrop bus line和Point-to-Point。采用的DB9接口类型&#xff0c;支持PLCA。10BASE-T1S是IEEE 802.3cg标准制定的IEEE汽车以太网的最新标准之一&#xff0c;采用UTP这样的一对无屏蔽的双芯电缆进行…

matlab simulink 电力系统同步发电机励磁系统的建模与仿真

1、内容简介 略 77-可以交流、咨询、答疑 电力系统同步发电机励磁系统的建模与仿真 建立MATLAB的同步发电机励磁调节系统仿真模型&#xff0c;最后建立了以PID和PSS为励磁控制方式的同步发电机励磁调节系统数学模型&#xff0c;在Simulink环境下进行了仿真&#xff0c;收到…

C++除了Qt还有什么GUI库?

C除了Qt还有什么GUI库&#xff1f; 先&#xff0c;不要折腾&#xff0c;不要想着用 C 来做 App 类的 GUI 开发。 所以你问用 c gui 库&#xff0c;本来确实有很多&#xff0c;但是经过几十年的沉淀&#xff0c;最后只留下一个 qt quick 和其他特殊需求的库&#xff08;包括 qt…

【Flutter 面试题】Flutter如何进行本地存储和缓存数据?

【Flutter 面试题】Flutter如何进行本地存储和缓存数据&#xff1f; 文章目录 写在前面口述回答补充说明实际案例完整代码示例运行结果详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云…

【火猫TV】LPL春季赛前瞻:Tabe迎战LNG OMG关键一战!

北京时间3月20日&#xff0c;LPL春季赛今天继续进行&#xff0c;今天将会迎来春季赛常规赛第八周第三个比赛日&#xff0c;今天的两场比赛是LNG战队对阵AL战队以及OMG战队对阵BLG战队&#xff0c;今天的两场比赛对于LNG、AL以及OMG战队都是比较重要的&#xff0c;目前三支战队都…