Leetcode每日一题:287.find-the-duplicate-number(寻找重复数)

Leetcode每日一题:287.find-the-duplicate-number(寻找重复数)_第1张图片
思路:一开始并没有什么头绪,直接排序加遍历以O(nlgn)的复杂度水过去了,后来看评论才知道有Floyd判圈算法这么秒的方法,简称龟兔赛跑;
具体算法讲解可参考文章:算法-floyd判环(圈)算法,讲得很棒,便于理解;

Leetcode每日一题:287.find-the-duplicate-number(寻找重复数)_第2张图片


// 先排序再查找 O(nlgn)
// static bool cmp(int a, int b)
// {
// 	return a < b;
// }

// int findDuplicate(vector &nums)
// {
// 	int len = nums.size();
// 	int res = nums[0];
// 	//先排序
// 	sort(nums.begin(), nums.end(), cmp);
// 	for(int i=0;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];
}

你可能感兴趣的:(Leetcode,算法,leetcode)