文章目录 题目描述思路 & 代码更新 题目描述 可以理解成数组版本的 环形链表 II更多详细思路可见以上超链接。 思路 & 代码 如何转化成逻辑上的链表?nums[i] 是 第 i 个结点的 next 指针构造成一个有 nums.length - 重复次数 个结点的链表如此,该链表中肯定成环(可以自己画数组转化成逻辑上的链表图理解下)时间复杂度 O(n),空间复杂度 O(1),未修改数组,重复证明(slow 路程超过 nums.length / 2即可) class Solution { public int findDuplicate(int[] nums) { // 类似环形链表II,用快慢指针做。看成一个环形链表, nums[i] 相当于 i.next // 链表中结点数 = nums.length - 重复次数 int slow = nums[0], fast = nums[0]; // 第一次相遇结束 do { slow = nums[slow]; fast = nums[nums[fast]]; } while(slow != fast); // fast放到头,重新开始run,再次相遇就是答案 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; } }