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

在这里插入图片描述
思路:一开始并没有什么头绪,直接排序加遍历以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];
}

猜你喜欢

转载自blog.csdn.net/wyll19980812/article/details/108794470