题目详情如下:

注意:题目要求不能修改数组,不能只能使用O(1)的额外空间。

方法一(使用了O(n)的空间):

定义一个map<int,int>p,遍历数组nums,遇到数组中的一个元素就去看p是否出现过了当前的元素,如果出现了,那么就直接返回当前的元素。否则就在p中标记这个元素已经出现了。

方法二(不用O(n)的空间,但是修改了数组):

因为数组长度是n+1,然后数组元素的范围是[1,n].所以可以先从数组下标为0的元素开始遍历,记录下nums[0]的值,然后跳到以nums[0]值作为下标对应的元素,判断该元素是否为-1,如果为-1,则说明nums[0]已经出现过,直接返回nums[0]。否则定义一个变量v记录nums[nums[0]]的值,然后将当前的元素修改为-1,并且跳到以v为下标的元素,再重复上面的过程。
这里举一个例子:


正确方法

假如方法二中的方法和例子,假设不修改数组的元素,那么数组的遍历顺序为:

4->2->3->2->3->2->3........

此时,我们可以发现,数组将进入一个环[2->3]

我们假设,有两个指针slow和fast,slow指针每走一步,fast指针走两步。假设slow指针走了n步,那么fast指针走了2n步,此时slow指针和fast指针在环内相遇。假设从开头到的环开头的步数为m,环内的周长为c。
那么我们可以得到slow指针在环内走了n-m步,fast指针在环内走了2n-m,fast指针在环内比slow指针多走了n步。两个指针能在环内相遇,那么fast指针比slow指针多走了几圈环,所以有n%c=0

此时我们再定义一个指针finder从开头出发,slow指针也从当前位置出发,直到两个指针相遇时,相遇的地方就是环开头的地方,也就是我们要找的重复的数,为什么呢?
当finder走到第m步时,就走到了环开头的地方。那么此时!!!!slow指针在环内走了n-m+m=n步。由于n%c=0,所以,slow指针也走到了环开头的地方。所以finder指针和slow指针会在环开头相遇。

根据上面的思路,我们有如下代码:

另外leetcode有类似的题目:

leetcode寻找重复数相关推荐

  1. 快慢指针(LeetCode寻找重复数),弗洛伊德的乌龟和兔子

    写此篇博客在于总结,记忆之用,欢迎评论补充. 弗洛伊德的乌龟和兔子,即快慢指针. 对于LeetCode287题,寻找重复数,题目如下: 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 ...

  2. 【LeetCode】【HOT】287. 寻找重复数(抽象环形链表)

    [LeetCode][HOT]287. 寻找重复数 文章目录 [LeetCode][HOT]287. 寻找重复数 package hot;public class Solution287 {publi ...

  3. LeetCode-287 寻找重复数 二分法

    LeetCode-287 寻找重复数 二分法 287. 寻找重复数 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数. ...

  4. 287. 寻找重复数

    寻找重复数 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. class So ...

  5. 【手绘漫画】图解LeetCode之寻找重复数(LeetCode287题),抽屉原理

    文章目录 图解LeetCode刷题计划 1.写在前面 2.题目 3.正文 4.代码 5.讨论 图解LeetCode刷题计划 1.写在前面 手绘漫画系列正式上线!!!"图解LeetCode刷题 ...

  6. leetcode 287. Find the Duplicate Number | 287. 寻找重复数(判断链表是否有环,并找到环的起点)

    题目 https://leetcode.com/problems/find-the-duplicate-number/ 题解 题目有限制 不能修改数组元素,必须 O(1) 空间复杂度,所以 不能排序, ...

  7. 【leetcode】287. 寻找重复数

    题目链接:传送门 题目描述: 给定一个数组 nums 包含 n + 1 个整数,每个整数在 1 到 n 之间,包括 1 和 n.现在假设数组中存在一个重复的数字,找到该重复的数字. 注意 不能修改数组 ...

  8. LeetCode 287. 寻找重复数(BitMap)

    文章目录 1. 题目信息 2. 解题 2.1 BitMap 2.2 set去重 2.3 官方解题,快慢指针 1. 题目信息 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之 ...

  9. 【leetcode】287 寻找重复数(查找)

    题目链接:https://leetcode-cn.com/problems/find-the-duplicate-number/ 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 ...

  10. leetcode 287. 寻找重复数(Find the Duplicate Number)

    目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一 ...

最新文章

  1. MPB:农科院田健、韩东飞等-​​水稻根系互作功能微生物的筛选方法
  2. 订单库存是否与库存地有关
  3. 终于开通我自己的cnblogs了,自我恭喜下··
  4. python学习-综合练习六(列表翻转、变量交换、复制列表、元素求和(lambda和递归)、字典排序、字典pop)
  5. WebSocket 详解教程
  6. CodeForces 785C Anton and Fairy Tale 二分
  7. three.js 后期处理,物体高亮
  8. Eclipse安装SVN
  9. qq2008珊瑚虫版SL
  10. Android控件全解手册 - 玩转TextView属性
  11. Quartz分布式定时任务
  12. 安永计划在印度雇佣2000人,扩大区块链等数字解决方案服务
  13. 计算机 控制面板都打不开怎么办,控制面板打不开怎么办?控制面板打开办法大全...
  14. 逻辑回归(神经网络Sigmod激活函数,计量logit模型)
  15. 保刚性图像变形算法-Siggraph 2004
  16. 夏日悦动“正当红”魅焰红版荣耀畅玩手环A2惊艳开售
  17. 隐马尔科夫模型——学习算法
  18. 一次HTTP链接会产生多少数据流量
  19. Vue基础语法知识(自用,完整版)
  20. MFC如何设置背景图片

热门文章

  1. 抖音的计算机技术优势,抖音成功的优势在哪里?
  2. 小型网络综合设计 (利用交换机实现不同VLAN之间相互通信)
  3. 台式计算机的打印机端口,台式电脑怎么连接网络打印机
  4. 选哪个:游戏开发和传统软件开发?
  5. 网易校招编程题------最长公共子括号序列
  6. 静态RAM读时序分析
  7. 茴香豆的“茴”有几种写法?单例模式你知道有几种写法?
  8. 5336: [TJOI2018]party
  9. UE4读取BackBuffer缓冲区贴图(屏幕表面)
  10. matlab经典例题及答案,matLAB经典例题及答案.pdf