class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n = nums.size();
int slow = n;
int fast = n;
do {
//cout << "1> slow: " << slow << ", fast: " << fast << endl;
slow = nums[slow-1];
fast = nums[nums[fast-1]-1];
//cout << "2> slow: " << slow << ", fast: " << fast << endl;
} while(fast != slow);
slow = n;
while(slow != fast) {
slow = nums[slow-1];
fast = nums[fast-1];
}
return slow;
}
};