Link:
题目要求
给定一个包含n + 1个整数的数组nums,其数字都在[1, n]范围内(包括1和n),可知至少存在一个重复的整数。假设nums只有 一个重复的整数 ,返回 这个重复的数 。你设计的解决方案必须 不修改 数组nums且只用常量级O(1)的额外空间。
核心算法和原理
- 看作一个链表,i -> next = nums[i]
- 由于存在唯一重复数,则存在环
- 用链表求环的方法得到这个环即可
- 自环情况:由于nums[0..n] = [1, n],保证nums[0]一定不等于0,所以0一定不是自环;
- 如果以0开头的链表存在自环,那这个自环的值即为所求;
- 如果不存在,那要么说明所有元素都没有自环,要么说明不在0开头的链表里
代码
class Solution { public: int findDuplicate(vector<int>& nums) { if (nums.size() <= 2) { return nums[0]; } int slow = nums[0], fast = nums[nums[0]]; while (slow != fast) { slow = nums[slow]; fast = nums[nums[fast]]; } slow = 0; while (slow != fast) { slow = nums[slow]; fast = nums[fast]; } return slow; } };
