题目描述
可以理解成数组版本的 环形链表 II 更多详细思路可见以上超链接。
思路 & 代码
如何转化成逻辑上的链表? nums[i] 是 第 i 个结点的 next 指针 构造成一个有 nums.length - 重复次数 个结点的链表 如此,该链表中肯定成环(可以自己画数组转化成逻辑上的链表图理解下) 时间复杂度 O(n),空间复杂度 O(1),未修改数组, 重复证明(slow 路程超过 nums.length / 2即可)
class Solution { public int findDuplicate ( int [ ] nums) { int slow = nums[ 0 ] , fast = nums[ 0 ] ; do { slow = nums[ slow] ; fast = nums[ nums[ fast] ] ; } while ( slow != fast) ; fast = nums[ 0 ] ; while ( fast != slow) { fast = nums[ fast] ; slow = nums[ slow] ; } return fast; }
}
更新
主要是不能修改原数组 数字转换成节点,重复数字相当于多个数字表示一个节点 根据存储值对应下标 ,来构造链表关系。
class Solution { public int findDuplicate ( int [ ] nums) { int slow = nums[ 0 ] , fast = nums[ 0 ] ; do { slow = nums[ slow] ; fast = nums[ nums[ fast] ] ; } while ( slow != fast) ; fast = nums[ 0 ] ; while ( slow != fast) { fast = nums[ fast] ; slow = nums[ slow] ; } return slow; }
}