题目链接:传送门

题目描述:

给定一个数组 nums 包含 n + 1 个整数,每个整数在 1 到 n 之间,包括 1 和 n。现在假设数组中存在一个重复的数字,找到该重复的数字。

注意

  1. 不能修改数组元素,假设数组是只读的。
  2. 仅可以使用常数即O(1)O(1)的额外空间。
  3. 时间复杂度需要低于O(n2)O(n2)。
  4. 数组中仅有一个重复数字,但它可能重复超过1次。

样例

Example 1:

Input: [1,3,4,2,2]

Output: 2

Example 2:

Input: [3,1,3,4,2]
Output: 3

算法
(双指针移动) O(n)
因为每个数都是 1 到 n,所以此题可以当做Linked List Cycle II来处理。
首先first和second指针均为0,然后first每次前进一格,second每次前进两格。i前进一格在这里指的是nums[i]。剩余部分请参考Linked List Cycle II中的算法证明。
时间复杂度
参见Linked List Cycle II时间复杂度部分,整个数组仅遍历常数次,故时间复杂度为O(n)。

作者:wzc1995
链接:https://www.acwing.com/solution/LeetCode/content/302/


将数组转化为链表形式:数组 [1,3,4,2,2]

current / index

0

1 2 3 4

next / num[index]

1 3 4 2 2

index为当前值的索引,num[index]为下个一值的索引next index。上表中的数组表示成链表如下图,方框中为index, num[index]

利用【142_环形链表 II】的方法,找到环入口,即为重复数字

设:

  slow指针移动速度为1,fast指针移动速度为2;slow指针在环内移动(非环部分)长度为a,slow指针在环内移动长度为b

  两指针相遇时候,slow指针移动距离为a+b,fast指针移动距离为2(a+b),可知两指针距离差a+b即为整数倍的环长

  从head移动a的距离为入环点;由2可知从head开始移动a+(a+b)的距离也为入环点,即将A点继续移动距离a则可到达入环点

  将slow指针移动回head,同时同速移动两个指针,相遇点即为入环点

说明:

  因为数组中不含0,所以不会因为index = 0, num[0] = 0导致死循环;对于其他位置index = num[index],若该值重复则会自身成环,若无重复则不会被遍历到

作者:LuoRong1994
链接:https://leetcode-cn.com/problems/two-sum/solution/287_xun-zhao-zhong-fu-shu-by-user9081a/


  1. class Solution {
  2. public:
  3. int findDuplicate(vector<int>& nums) {
  4. int cnt = ;
  5. int L = , R = nums.size() - , Mid , ans = ;
  6. while ( L < R ) {
  7. Mid = (L+R) >> ;
  8. cnt = ;
  9. for ( int x : nums )
  10. cnt += L <= x && x <= Mid ;
  11. if ( Mid - L + < cnt ){
  12. R = Mid ;
  13. }else {
  14. L = Mid + ;
  15. }
  16. }
  17. return R ;
  18.  
  19. }
  20. };

二分做法

  1. class Solution {
  2. public:
  3. int findDuplicate(vector<int>& nums) {
  4. int Fir , Sec ;
  5. Fir = Sec = ;
  6. do{
  7. Fir = nums[Fir] ;
  8. Sec = nums[nums[Sec]] ;
  9. }while ( Fir != Sec );
  10.  
  11. Fir = ;
  12. while ( Fir != Sec ){
  13. Fir = nums[Fir] ;
  14. Sec = nums[Sec] ;
  15. }
  16. return Fir;
  17. }
  18. };

双指针

【leetcode】287. 寻找重复数的更多相关文章

  1. Java实现 LeetCode 287 寻找重复数

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

  2. leetcode 287寻找重复数

    这道题用STL容器就很好写了,可以用set也可以用map, 用unordered_map的C++代码如下: class Solution { public: int findDuplicate(vec ...

  3. LeetCode | 287. 寻找重复数

    特别感谢LeetCode大佬陈牧远的科普知识 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找 ...

  4. [LeetCode]287. 寻找重复数(二分)

    题目 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 1: 输入: [ ...

  5. LeetCode:寻找重复数【287】

    LeetCode:寻找重复数[287] 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数 ...

  6. Leetcode之二分法专题-287. 寻找重复数(Find the Duplicate Number)

    Leetcode之二分法专题-287. 寻找重复数(Find the Duplicate Number) 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和  ...

  7. 287. 寻找重复数 Java解法

    287. 寻找重复数 这题的难点就在于下面的说明了,我们先不管下面的那些说明的要求,用常规的解法来解答下上的题目. 排序思想解法 先把原来的数组进行排序,然后逐个遍历,一旦发现后一个元素和当前的元素相 ...

  8. 【Leetcode】287. 寻找重复数(数组模拟链表的快慢指针法)

    寻找重复数 根据题意,数组中的数字都在1~n之间,所以数字的范围是小于数组的范围的,数组的元素可以和数组的索引相联系. 例如:nums[0] = 1 即可以将nums[0]作为索引 通过nums[0] ...

  9. Leetcode题目287.寻找重复数(中等)

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

随机推荐

  1. UVALive 4394 String painter ——(区间DP)

    其实这个dp过程有点似懂非懂...代码如下: #include <stdio.h> #include <algorithm> #include <string.h> ...

  2. gdb常用的调试命令

    首先将源代码编译.链接生成debug版本的可执行文件,然后通过‘gdb  debug版本的可执行文件名’进入调试模式. a) 单进程.单线程基础调试命令 l    显示main函数所在的文件的源代码 ...

  3. [转发]Android视频技术探索之旅:美团外卖商家端的实践

    美团技术团队 2019-09-12 20:02:11 背景 2013年美团外卖成立,至今一直迅猛发展.随着外卖业务量级与日俱增,单一的文字和图片已无法满足商家的需求,商家迫切需要更丰富的商品描述手段吸 ...

  4. HearthAgent A Hearthstone agent

    http://www.intelligence.tuc.gr/~robots/ARCHIVE/2015w/Projects/LAB51326833/download.html The project ...

  5. Flume-数据流监控 Ganglia

    Ganglia 由 gmond.gmetad 和 gweb 三部分组成. gmond(Ganglia Monitoring Daemon)是一种轻量级服务,安装在每台需要收集指标数据的节点主机上.使用 ...

  6. Kombu is a messaging library for Python.

    https://kombu.readthedocs.io/en/stable/introduction.html

  7. SQL-W3School-高级:SQL LEFT JOIN 关键字

    ylbtech-SQL-W3School-高级:SQL LEFT JOIN 关键字 1.返回顶部 1. SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1 ...

  8. 【I·M·U_Ops】------Ⅰ------ IMU自动化运维平台设想

    说明本脚本仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. #A 搞这个平台的初心 由于之前呆的单位所有IT相关硬件资源都要我们 ...

  9. Linux学习:Makefile简介及模板

    一.基本概念介绍: Makefile 文件就是告诉make命令需要怎么样的去编译和链接程序. 编写Makefile的基本规则: 1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接. 2. ...

  10. 12Flutter页面布局 AspectRatio和Cart卡片组件

    /* Flutter AspectRatio.Cart卡片组件: AspectRatio的作用是根据设置调整子元素child的宽高比. AspectRatio首先会在布局限制条件允许的范围内尽可能的扩 ...