思路:
转换成链表之后使用floyed判环法。转换之后重复的那个数字是唯一一个有多个前驱和一个后继的节点,因此是环的起始节点。
实现:
1 class Solution 2 { 3 public: 4 int findDuplicate(vector<int>& nums) 5 { 6 int p = nums[0], q = nums[0]; 7 while (true) 8 { 9 p = nums[nums[p]]; 10 q = nums[q]; 11 if (p == q) break; 12 } 13 p = nums[0]; 14 while (true) 15 { 16 if (p == q) break; 17 p = nums[p]; 18 q = nums[q]; 19 } 20 return p; 21 } 22 };