题目

/**
* 给定一个包含 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),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数相关推荐

  1. 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组(GO,PHP)

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  2. 【排序】 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。(java)

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  3. 2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums

    2021-12-19:找到所有数组中消失的数字. 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums ...

  4. 2.5亿个整数中找出不重复的整数

    问题描述:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数. 思路:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共 ...

  5. 在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数

    方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受.然后扫描这2.5亿个整数 ...

  6. C++输入n(n100)个整数,找出其中最大的数,将它与最前面的数交换后输出这些数

    题目 2016校园招聘笔试题 输入n(n<100)个数,找出其中最大的数,将它与最前面的数交换后输出这些数,请你编程实现. 输入 输入数据有多行,每组占一行,每行的开始是一个整数n,表示这个测试 ...

  7. 【咕嘎文本对比助手】如何两份手机号或文本对比去重,新旧两批号码如何快速的对比重复,找出重复和不重复的部分,单个文件如何找出重复,单个文件如何找出不重复下面关于五种逻辑做详细解答

    在手机号码整理过程中,群发短信还有大数据分析等整理文件的过程中经常有号码重复 有人说excel有两列数据,怎么用vlookup查找两列数据是否有重复值?在SQL语句中就很好处理了not in 就完事了 ...

  8. 大数据面试题——如何在大量的数据中找出不重复的数

    问题描述: 在2.5亿个整数中找出不重复的数,注意,内存不足以容纳2.5亿个整数. 分析解读: 方法一:分治法 采用hash的方法,把这2.5亿个数划分到更小的文件中,从而保证每个文件的大小不超过可用 ...

  9. 2022-09-07:给你一个由正整数组成的数组 nums 。 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。 例如,序列 [4,6,16] 的最大公约数是 2 。 数组的一个

    2022-09-07:给你一个由正整数组成的数组 nums . 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数. 例如,序列 [4,6,16] 的最大公约数是 2 . 数组的一个 ...

最新文章

  1. 搜索引擎, 请手下留情
  2. 有道python网课怎么样-网易有道2017内推编程题 洗牌(python)
  3. 02、Kubernetes 入门(上)-重新认识Docker
  4. 详解Vue.use使用与原理
  5. Nacos源码DistroConsistencyServiceImpl
  6. POJ - 3974 Palindrome(二分+哈希/马拉车)
  7. ABB 机器人 DRVIO_1通信报警
  8. HTML简单实例加表单的显示效果
  9. python爬虫大作业爬多少数据_爬虫大作业
  10. CSP202009-2 风险人群筛查(100分)【序列处理】
  11. OmniGraffle 7 Pro全新推出!V7.18.3(204.9.0)正式版 支持M1
  12. 地震预警,生死十秒,我们能做些什么?
  13. r语言初学者指南_由R入统:R语言统计学类书籍推荐
  14. 01.业务编号规则与算法整合
  15. 计算机专业毕设一般写什么,计算机专业毕设主要流程
  16. MySQL的金科玉律:“不要使用SELECT *”
  17. TimusOJ - 1225.Flags 1119.Metr 1009.K-based Numbers (DP简单题)
  18. 【总结】PHP常见面试题汇总(一)。。。
  19. 关于测试架构师的解读
  20. 阿里“无影” | 未来每个人在云上都会有自己的主机

热门文章

  1. 求生技能必备:如何从被困水中的车里逃生
  2. Oracle 授权用户只能查看几张表
  3. Go新项目-项目添加版本说明,以及参数传递:ldflags、gcflags,外加stripped说明(5)
  4. 循环矩阵与傅里叶变换
  5. python 带账号密码的爬取
  6. centos双机热备
  7. 以太网网口信号测试软件,以太网网口流量测试,吞吐量测试
  8. php 一位数组合并,php数组合并
  9. crc16的c语言函数 计算ccitt_CCITT CRC-16计算原理与实现
  10. 如何使用Kali破解WIFI密码蹭网?