Leecode:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数
题目
/**
* 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。* 示例 1:
* 输入: [1,3,4,2,2]
* 输出: 2* 示例 2:
* 输入: [3,1,3,4,2]
* 输出: 3
* 说明:* 不能更改原数组(假设数组是只读的)。
* 只能使用额外的 O(1) 的空间。
* 时间复杂度小于 O(n2) 。
* 数组中只有一个重复的数字,但它可能不止重复出现一次。
*/
分析
首先单纯地看这个题目,不是很复杂,常规方法也有很多,但加上后面的要求,就比较复杂了。
加上 时间复杂度 和 空间复杂度 的要求,这道题就从 普通的编程题 变成了 算法题。
我们先逐一看看这几个条件:
不能更改原数组,这意味着:
不能对原数组进行排序等操作(如果能排序,这道题就好做了)。
只能使用额外的 O(1) 的空间,这意味着:
我们也不能 copy 出来一个数组来进行操作,也不能利用 hash去重 的思路来做了。
时间复杂度小于 O(n2) ,这意味着:
我们也不能用简单的双重循环去暴力寻找。
数组中只有一个重复的数字,但它可能不止重复出现一次:
单纯地为了增加题目情况的一般性。
思路
尽可能的抓住题目中的条件,才能更好的达到题目要求。
关键条件:
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
这意味着:
数组里的值,不会超出数组下标的取值范围。
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
这意味着:
如果我们就像上述所说的,把取出来的 value值 继续当做下标。
那么,一定至少会有 2 个value值相同,也就是,至少会有两个节点指向同一个节点。这种情况,就是出现了 环 。
如图所示:
这样就把问题转换成了 寻找一个有环链表的 环入口了。
代码实现(Java)
快慢指针法
- slow 一次走一步,fast 一次走两步,当他们相遇,意味着他们两个一定在环里了。
- 令slow = 0 ,从头开始
- 这样 一个在环内走,一个从头走,遇上之后便找到了环的入口。
public int findDuplicate(int[] nums) {int slow = 0;int fast = 0;while(true){slow = nums[slow];fast = nums[nums[fast]];if(fast == slow){slow = 0;while(slow != fast){slow = nums[slow];fast = nums[fast];}return slow;}}}
That’s all ,,Thank you !!
Leecode:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数相关推荐
- 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组(GO,PHP)
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三 ...
- 【排序】 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。(java)
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三 ...
- 2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums
2021-12-19:找到所有数组中消失的数字. 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums ...
- 2.5亿个整数中找出不重复的整数
问题描述:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数. 思路:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共 ...
- 在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数
方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受.然后扫描这2.5亿个整数 ...
- C++输入n(n100)个整数,找出其中最大的数,将它与最前面的数交换后输出这些数
题目 2016校园招聘笔试题 输入n(n<100)个数,找出其中最大的数,将它与最前面的数交换后输出这些数,请你编程实现. 输入 输入数据有多行,每组占一行,每行的开始是一个整数n,表示这个测试 ...
- 【咕嘎文本对比助手】如何两份手机号或文本对比去重,新旧两批号码如何快速的对比重复,找出重复和不重复的部分,单个文件如何找出重复,单个文件如何找出不重复下面关于五种逻辑做详细解答
在手机号码整理过程中,群发短信还有大数据分析等整理文件的过程中经常有号码重复 有人说excel有两列数据,怎么用vlookup查找两列数据是否有重复值?在SQL语句中就很好处理了not in 就完事了 ...
- 大数据面试题——如何在大量的数据中找出不重复的数
问题描述: 在2.5亿个整数中找出不重复的数,注意,内存不足以容纳2.5亿个整数. 分析解读: 方法一:分治法 采用hash的方法,把这2.5亿个数划分到更小的文件中,从而保证每个文件的大小不超过可用 ...
- 2022-09-07:给你一个由正整数组成的数组 nums 。 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。 例如,序列 [4,6,16] 的最大公约数是 2 。 数组的一个
2022-09-07:给你一个由正整数组成的数组 nums . 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数. 例如,序列 [4,6,16] 的最大公约数是 2 . 数组的一个 ...
最新文章
- 搜索引擎, 请手下留情
- 有道python网课怎么样-网易有道2017内推编程题 洗牌(python)
- 02、Kubernetes 入门(上)-重新认识Docker
- 详解Vue.use使用与原理
- Nacos源码DistroConsistencyServiceImpl
- POJ - 3974 Palindrome(二分+哈希/马拉车)
- ABB 机器人 DRVIO_1通信报警
- HTML简单实例加表单的显示效果
- python爬虫大作业爬多少数据_爬虫大作业
- CSP202009-2 风险人群筛查(100分)【序列处理】
- OmniGraffle 7 Pro全新推出!V7.18.3(204.9.0)正式版 支持M1
- 地震预警,生死十秒,我们能做些什么?
- r语言初学者指南_由R入统:R语言统计学类书籍推荐
- 01.业务编号规则与算法整合
- 计算机专业毕设一般写什么,计算机专业毕设主要流程
- MySQL的金科玉律:“不要使用SELECT *”
- TimusOJ - 1225.Flags 1119.Metr 1009.K-based Numbers (DP简单题)
- 【总结】PHP常见面试题汇总(一)。。。
- 关于测试架构师的解读
- 阿里“无影” | 未来每个人在云上都会有自己的主机