将一个数组中不重复_你不知道的解法:数组中重复的数字
点击关注上方“五分钟学算法”,
设为“置顶或星标”,一起成长
今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字。
题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
一、题目描述
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3
限制:
2 <= n <= 100000
二、题目解析
注意题目描述:一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的 范围内,这个 范围 恰好与数组的下标可以一一对应。
所以我们可以执行某种操作,使索引与值一一对应,即索引 0 的值为 0,索引 1 的值为 1。而一旦某个索引的值不只一个,则找到了重复的数字,也即发生了 哈希冲突。
三、动画描述
四、图片描述
五、参考代码
class Solution { public int findRepeatNumber(int[] nums) { //设索引初始值为 i = 0 int i = 0; //遍历整个数组 nums while(i //索引 i 的值为 i,无需执行交换操作,查看下一位 if(nums[i] == i) { i++; continue; } //索引 nums[i] 处的值也为 nums[i],即找到一组相同值,返回 nums[i] 即可 if(nums[nums[i]] == nums[i]) return nums[i]; //执行交换操作,目的是为了使索引与值一一对应,即索引 0 的值为 0,索引 1 的值为 1 int tmp = nums[i]; nums[i] = nums[tmp]; nums[tmp] = tmp; } //如果遍历整个数组都没有找到相同的值,返回 -1 return -1; }}
六、复杂度分析
时间复杂度
遍历数组需要 O(N) 时间。
注意参考代码里面的关键字 continue,这表示在 while
的一次循环里面,只有这次循环将 索引(i) 与 索引值(num[i]) 匹配到了,才会执行下一次循环。
在每一次的循环过程中,索引(i) 与 索引值(num[i]) 匹配到后,在后续的循环过程中不会操作它们,所以虽然一开始的循环过程中,执行的交换操作较多,但在后续的循环过程中根本不需要再执行操作了。
根据均摊复杂度分析 ,总的时间复杂度为 O(N) ,N 为数组的长度。
空间复杂度
使用常数复杂度的额外空间,为 O(1)。
七、相关标签
数组
哈希
原地哈希
今天是 『 365 刷题计划 』 第 41 天。每晚八点,一起图解一道算法题,不见不散!
欢迎关注我的公众号“图解面试算法”,如果喜欢,麻烦点一下“在看”,转发+在看相当于打赏!
将一个数组中不重复_你不知道的解法:数组中重复的数字相关推荐
- java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...
java从数组查找指定整数 自从我讨论任何编码或算法面试问题以来已经有很长时间了,因此我想重新考虑一种最流行的基于数组的编码问题,即在给定数组中查找缺失的数字. 在进行编程工作面试之前,您可能已经听说 ...
- hashset如何检查重复_如何使用 C# 中的 HashSet
译文链接:https://www.infoworld.com/article/3586972/how-to-use-hashset-in-csharp.html HashSet 是一个优化过的无序集合 ...
- 共享内存中使用指针_详解c++中字符指针数组的使用
之前有写过一篇叫c++中动态数组的使用,今来看看c++中的字符指针数组的使用. 涛哥:c++中的动态数组使用zhuanlan.zhihu.com 指针数组,就指向指针的指针,很早以前在说指针的时候说 ...
- java在数组中放入随机数_如何在Java中随机播放数组
java在数组中放入随机数 There are two ways to shuffle an array in Java. 有两种方法可以在Java中随机播放数组. Collections.shuff ...
- java 判断数组已经存满_详解Java中数组判断元素存在几种方式比较
1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ...
- php接口返回一个数组怎末写_返回php数组
PHP数组简介 v 一.PHP数组的分类 按照下标的不同,PHP中的数组分为关联数组和索引数组: 索引数组:下标从0开始,依次增长. $arr=[1,2,3,4,5]; 关联数组:下标为字符串格式,每 ...
- 范数在机器学习中的作用_设计在机器学习中的作用
范数在机器学习中的作用 Today, machine learning (ML) is a component of practically all new software products. Fo ...
- mysql中groupby用法_详解SQL中GroupBy的用法
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. 1.概述 "Group By"从字面意义上理解就是根据"By"指定的规则对数据进行分 ...
- python中add函数_如何使用python中的add函数?
之前向大家介绍过python中的求和函数sum函数,numpy中的sum函数,对于数组可以指定维度进行相加.numpy中还有另一种求和运算方法,即add函数.add函数不仅作用于numpy中加法运算, ...
最新文章
- 《剑指offer》c++版本 5.替换空格
- 09945 oracle 解决方法_ORACLE rman与RMAN-00054ORA-09945
- 使java代码更干净_java如何使用Lombok更优雅地编码
- php什么是变量6,PHP变量是什么
- 大数据之-Hadoop_1.x和2.x区别---大数据之hadoop工作笔记0012
- Firefox关闭最后一个标签页时不关闭Firefox的设置
- 驱动重构SDN/NFV奠定未来网络基石
- 图像融合(四)-- 对比度金字塔
- KML和KMZ 用什么软件打开?
- DELPHI7第三方控件安装
- Java小开发(汽车租赁系统)
- Spring 框架学习—控制反转(IOC)
- Taylor Swift -- Crazier 附英文和中文歌词
- 物联网方面的竞赛有那些?
- 关于Android的方向传感器
- M480 EMAC驱动02-IP101G测试
- Github上利用win10使用TensorFlow(GPU)上如何去训练一个目标多分类检测的例子
- Mybatis学习总结(结合个人理解)
- IntelliJ IDEA 快捷键大全(Mac版)
- linux开发板tftp 搭建,iTOP-i.MX6ULL开发板-Tftp烧写和Nfs启动
热门文章
- 让Python输出更漂亮
- springMVC中数据流解析与装载
- java 语法 —— 数组
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
- BZOJ4448:[SCO2015]情报传递
- winform下自绘提示框风格窗体
- Hadoop MapReduce执行过程(一)
- C语言课后习题(39)
- java 开发平台idea_JAVA开发平台intellij idea使用教程:有哪些方法可以实现自动导入...
- figtree如何编辑进化树_进化树的注释:ggtree