O(nlogn):
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n = nums.size(), begin = 1, end = n-1, mid, i, count;
while(begin < end)
{
count = 0;
mid = (end-begin)/2 + begin;
for(i = 0; i < n; ++i)
{
if(nums[i] <= mid)
++count;
}
if(count > mid)
end = mid;
else
begin = mid+1;
}
return begin;
}
};
O(n):
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n = nums.size(), slow = nums[0], fast = nums[nums[0]], i = nums[0];
while(slow != fast)
{
slow = nums[slow];
fast = nums[nums[fast]];
}
slow = nums[slow];
while(i != slow)
{
i = nums[i];
slow = nums[slow];
}
return i;
}
};