解题思路:
快慢指针
-
第一步,慢指针每次移动一步,快指针每次移动两步,直到它们相遇。这一步保证了它们在环中相遇。
-
接下来,将其中一个指针(快指针或慢指针)重置到起点(即数组的第一个位置),然后两个指针都每次只移动一步。它们再次相遇的位置就是环的起始节点,也就是数组中重复的元素。
class Solution {
public int findDuplicate(int[] nums) {
int slow = 0, fast = 0;
do {
slow = nums[slow];
fast = nums[nums[fast]];
} while (slow != fast);
slow = 0;
while (slow != fast) {
slow = nums[slow];
fast = nums[fast];
}
return slow;
}
}