剑指 Offer 03.:数组中重复的数字

剑指 Offer 03. 数组中重复的数字

找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 

限制:

2 <= n <= 100000


思路分析:排序+查找

题目显而易见的一个解决方法是对该数组进行排序,然后在排序的数组中查找出重复元素就很容易了,至于排序的方法,为了熟悉一下快排,因此在这里我使用的是手写的快排。具体见下面的解法一。

C++代码:
class Solution {
public:int findRepeatNumber(vector<int>& nums) {int n = nums.size();//1.排序//也可以用库函数//sort(nums.begin(),nums.end());quickSort(nums,0,n-1);//2.查找for(int i=0;i<n;i++){if(nums[i]==nums[i+1]){return nums[i];}}return -1;}//快排void quickSort(vector<int>&a,int left,int right){//特判if(left>=right) return;int i = left-1;int j = right+1;int x = a[left+right>>1];while(i<j){do i++;while(a[i]<x);do j--;while(a[j]>x);if(i<j){swap(a[i],a[j]);}}//递归左边部分quickSort(a,left,j);//递归右边部分quickSort(a,j+1,right);}
};
复杂度:

时间:排序一个长度为n的数组需要 O(nlogn) 的时间。

空间:常数空间 O(1)


思路分析:(优化)哈希表

提到 重复二字,必然少不了哈希表。具体的,遍历整个数组,每次扫描数组中每一个值,可以判断其有没有在哈希表中,如果在,直接返回,否则,只需要更新一下哈希表状态即可。

C++代码:
class Solution {
public:int findRepeatNumber(vector<int>& nums) {int n = nums.size();//开一个哈希表unordered_map<int,bool> mp;//遍历nums数组for(int i:nums){//如果该值已存在,直接返回if(mp[i]){return i;}//更新一下哈希表的状态mp[i] = true;}return -1;}
};
复杂度:

时间:由于哈希表每次判断只需要O(1)的时间,长度为n的数组,因此复杂度为O(n)。

空间:毫无疑问,这种解法使得在时间上得到了优化,同时却是以牺牲O(n)的哈希表空间换取的,所以空间复杂度为O(n)


思路分析:(再优化)原地交换

原地交换??

在具体的题目中,有的解题方法是需要我们对题目已经其数据进行观察,找到规律进而得到一条捷径,这里不妨以提供的用例:[2, 3, 1, 0, 2, 5, 3]配合图解来加以论述该方法的可行性。

数组中的重复数字

很容易观察到,如果对没有重复数字的数组进行排序,那么排序之后的数字i将会出现在下标为i的位置。

复现一下这个重排的大致过程:

扫一遍数组,到下标为i时,首先判断一下该处的值(假如为v)是不是等于i

如果答案是肯定的,那么接着往下扫描下一个数。

如果不是,再拿它和第v个数字进行比较,如果此时它(这里指的是i)和v相等,说明找到了一个重复数字。

如果它和第v个数字不相等,就将把第i个数和第v个数进行交换,也就是把v放到原本属于它的位置。

重复以上比较、交换的过程,直到程序结束。

有点懵??再来亿遍,用例模拟。

还是上面的官方给的测试用例:[2, 3, 1, 0, 2, 5, 3]


第一步:i=0,判断:nums[0]==2!=0交换:swap(nums[0],nums[nums[0]])即是交换(2,1)的位置。

结果:[1, 3, 2, 0, 2, 5, 3]满足条件【nums[i]不等于ii不变,继续扫描。


第二步:i=0,判断:nums[0]==1!=0交换:swap(nums[0],nums[nums[0]])即是交换(1,3)的位置。

结果:[3, 1, 2, 0, 2, 5, 3]满足条件【nums[i]不等于ii不变,继续扫描。


第三步:i=0,判断:nums[0]==3!=0交换:swap(nums[0],nums[nums[0]])即是交换(3,0)的位置。

结果:[0, 1, 2, 3, 2, 5, 3]满足条件【nums[i]不等于ii不变,继续扫描。


第四步:i=0,判断:nums[0]==0满足条件【nums[i]==i】此时[0, 1, 2, 3, 2, 5, 3]``````i++继续下一轮比较。


第五步:i=1,判断:nums[1]==1满足条件【nums[i]==i】此时[0, 1, 2, 3, 2, 5, 3]``````i++继续下一轮比较。


第六步:i=2,判断:nums[2]==2满足条件【nums[i]==i】此时[0, 1, 2, 3, 2, 5, 3]``````i++继续下一轮比较。


第七步:i=3,判断:nums[3]==3满足条件【nums[i]==i】此时[0, 1, 2, 3, 2, 5, 3]``````i++继续下一轮比较。


第八步:i=4,判断:nums[4]==2!=4交换:swap(nums[4],nums[nums[4]])即是交换(2,2)的位置。

注意,这里我们发现此时交换的数字都是2,不过前者的下标为i=4,而后者下标i=2,就是说,此时我们已经找到了数组中的一个重复值,因此进行返回即可,该用例答案为2,程序结束。

C++代码:
class Solution {
public:int findRepeatNumber(vector<int>& nums) {int n = nums.size();if(n<2) return -1;for(int i=0;i<n;i++){if(nums[i]<0) return -1;}for(int i=0;i<n;i++){while(nums[i]!=i){if(nums[i]==nums[nums[i]]){return nums[i];}swap(nums[i],nums[nums[i]]);}}return -1;}
};
复杂度:

时间:O(n)。

空间:O(1)。

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

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

相关文章

DIN特征加权、POSO特征增强、SENET特征选择

本文转自&#xff1a;DIN、POSO、SENet 聊聊推荐模型中常用的Attention-腾讯云开发者社区-腾讯云 一、前言 聊起模型结构的时候&#xff0c;经常听做推荐的同学说&#xff1a; "这里加了个self-attention" "类似于一个SENet" "一个魔改的POSO"…

第6章 Mybatis高级查询(详解篇)

第6章 Mybatis高级查询_详解篇 1. 一对一映射1.1 自动映射(关联的嵌套结果映射)1.2 使用 resultMap 配置一对一映射resultMap复用1.3 association 标签的嵌套结果映射resultMap复用1.4 association标签的嵌套查询结构分析嵌套查询加载方式延迟记载注意事项延迟记载:利用@Respon…

[Visual Studio 报错] error 找不到指定的 SDK“Microsoft

[Visual Studio 2022 报错] error : 找不到指定的 SDK“Microsoft.NET.Sdk.Web” 问题描述&#xff1a; 在新电脑上安装了VS2022&#xff0c;打开现有项目的解决方案后的时候报了这个错&#xff0c;所有projet文件都加载失败,如图所示&#xff1a; 报错分析及解决 打开项目配…

经验丰富也被裁了,失业快2年找不到工作?

前几天徐工说&#xff0c;他有个邻居&#xff0c;最近逮到他总是要跟他扯上几句。 原因是徐工一直是做嵌入式开发&#xff0c;而他一直做纯软件开发&#xff0c;具体不知道做后端还是前端。 他说&#xff0c;他至少有半年没上班了&#xff0c;之前在一家龙头物流公司上班。 碰上…

Netty websocket配置wss

录音配置https 导致ws连不上 Slf4j Component public class NettyServer {/*** 启动** throws InterruptedException*/private void start() throws InterruptedException {bossGroup new NioEventLoopGroup();workGroup new NioEventLoopGroup();ServerBootstrap bootstrap…

STM32 HAL库F103系列之DAC实验(二)

DAC输出正弦波实验 实验简要 1&#xff0c;功能描述 通过DAC1通道1(PA4)输出正弦波&#xff0c;然后通过DS100示波器查看波形 2&#xff0c;使用定时器7 TRGO事件触发转换 TEN1位置1、TSEL1[2:0]010 3&#xff0c;关闭输出缓冲 BOFF1位置1 4&#xff0c;使用DMA模式 DMAE…

SLMs之Phi-3:Phi-3的简介、安装和使用方法、案例应用之详细攻略

SLMs之Phi-3&#xff1a;Phi-3的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年4月23日&#xff0c;微软发布Phi-3&#xff0c;这是微软推出的一款新的开源AI模型家族Phi-3。背景痛点&#xff1a;小语言模型(SLM)尽管规模不大&#xff0c;但在语言理解、代码…

盲盒商城小程序(有米就出)

一款前端采用uniapp&#xff0c;后端采用Django框架开发的小程序&#xff0c;包含后台管理&#xff0c;如有人需要可联系演示功能&#xff08;个人开发&#xff0c;可商用/学习&#xff09;。 部分截图如下&#xff1a;

设备驱动-随记

1. dma_alloc_coherent函数是用于在Linux内核中为设备驱动程序分配用于DMA操作的内存区域的函数。DMA是指通过外部设备直接访问系统内存的过程&#xff0c;它通常用于设备之间的数据传输&#xff0c;比如网络数据包的接收和发送&#xff0c;磁盘I/O等。 这个函数在linux/dma-…

【刷题】C++ 版刷题指南

C 刷题指南&#xff08;自用&#xff09; 小tips&#xff1a;includestruct节点io输入输出练习其它 库输入迭代器stringvectordeque&#xff08;双端队列&#xff09;优先队列priority\_queue优先队列 tuple优先队列 结构体&#xff08;自定义排序&#xff09; mapsetpairtup…

文件摆渡:安全、高效的摆渡系统助力提升效率

很多组织和企业都会通过网络隔离的方式来保护内部的数据&#xff0c;网络隔离可以是物理隔离&#xff0c;也可以是逻辑隔离&#xff0c;如使用防火墙、VPN、DMZ等技术手段来实现&#xff0c;隔离之后还会去寻找文件摆渡方式&#xff0c;来保障日常的业务和经营需求。 进行网络隔…

Python的一些高级用法

Python的高级用法涵盖了更深入的编程技巧、设计模式、并发编程、性能优化等方面。以下是Python的一些高级用法&#xff1a; 1.装饰器 用于修改函数或类的行为的函数&#xff0c;常用于日志记录、性能分析等。 def my_decorator(func):def wrapper():print("Something i…

数据库变更时,OceanBase如何自动生成回滚 SQL

背景 在开发中&#xff0c;数据的变更与维护工作一般较频繁。当我们执行数据库的DML操作时&#xff0c;必须谨慎考虑变更对数据可能产生的后果&#xff0c;以及变更是否能够顺利执行。若出现意外数据丢失、操作失误或语法错误等情况&#xff0c;我们必须迅速将数据库恢复到变更…

jsp+springboot+java二手车交易管理系统258u6

设计而成的系统要有以下目标&#xff1a;管理员和用户能够跳转到不同的页面当中。因此要把系统的目标设置为如下几项&#xff1a; (1) 系统在操作上不能过于复杂。 (2) 用户对应着不同的角色 (3) 设计完成的数据库要有能够处理并发和安全的作用 (4) 设计完成的管理…

Python——目标检测标签中的英文名转化为对应的类别编号

Yolov5进行目标检测流程在下文中已做说明&#xff1a; Python——一文详解使用yolov5进行目标检测全流程&#xff08;无需gpu&#xff09;_yolo不用gpu-CSDN博客 在Yolov5使用中中&#xff0c;标签数据里类别的中文名&#xff0c;需要转换成类别编号。相关代码如下&#x…

亚马逊云科技提高企业生产力神器Amazon Q评测分析

一年一度的全球云计算春晚&#xff0c;亚马逊云科技Re:invent在2023年11月27于Vegas震撼来袭&#xff0c;其中最令人关注的就是CEO Adam在Keynote中分享的内容。其中一个新内容就是提升生产力神器: Amazon Q&#xff0c;可以说它重新定义了企业的工作模式。那具体它神在哪里呢&…

设计模式- 代理模式(Proxy Pattern)结构|原理|优缺点|场景|示例

设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型&#xff08;5种&#xff09; 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型&#xff08;7种&#xff09; 适配器…

Python构建学生信息管理系统:网站路由补充和首次运行

在之前的内容中&#xff0c;我们已经完成了学生信息管理系统&#xff08;Student Information Management System, SIMS&#xff09;的需求分析、环境搭建、数据库创建、项目结构的初始化&#xff0c;以及运行。正常做下来的朋友&#xff0c;会发现项目运行后输入http://127.0.…

vulfocus靶场thinkphp命令执行cve-2018-1002015

thinkPHP 5.0.x版本和5.1.x版本中存在远程代码执行漏洞&#xff0c;该漏洞源于ThinkPHP在获取控制器名时未对用户提交的参数进行严格的过滤。远程攻击者可通过输入‘&#xff3c;’字符的方式调用任意方法利用该漏洞执行代码 开启靶场&#xff1a; 使用工具&#xff1a; think…

使用微软Phi-3-mini模型快速创建生成式AI应用

微软Phi-3大语言模型是微软研究院推出的新一代系列先进的小语言模型。Phi-3系列包括phi-3-mini、phi-3-small和phi-3-medium三个不同规模的版本。这些模型在保持较小的参数规模的同时&#xff0c;通过精心设计的训练数据集和优化的算法&#xff0c;实现了与大型模型相媲美的语言…