思路:一开始并没有什么头绪,直接排序加遍历以O(nlgn)的复杂度水过去了,后来看评论才知道有Floyd判圈算法这么秒的方法,简称龟兔赛跑;
具体算法讲解可参考文章:算法-floyd判环(圈)算法,讲得很棒,便于理解;
// 先排序再查找 O(nlgn)
// static bool cmp(int a, int b)
// {
// return a < b;
// }
// int findDuplicate(vector<int> &nums)
// {
// int len = nums.size();
// int res = nums[0];
// //先排序
// sort(nums.begin(), nums.end(), cmp);
// for(int i=0;i<len-1;i++)
// {
// if(nums[i+1]==nums[i])
// {
// return nums[i];
// }
// }
// return res;
// }
// 龟兔赛跑
int findDuplicate(vector<int> &nums)
{
int len = nums.size();
int fast = 0, slow = 0;
while (nums[slow] != nums[fast] || fast == 0)
{
slow = nums[slow];
fast = nums[nums[fast]];
}
//此时fast和slow处于同一位置,并在环中
//置slow=0
slow = 0;
while (nums[slow] != nums[fast])
{
slow = nums[slow];
fast = nums[fast];
}
return nums[fast];
}