【发布时间】:2016-01-17 08:41:02
【问题描述】:
我正在调试以下问题并发布我正在调试和研究的解决方案,解决方案或类似的解决方案已发布在几个论坛上,但我认为当 num[0] = 0 或一般 num 时解决方案存在错误[x] = x?我对么?如果我错了,请随时纠正我。
给定一个包含 n + 1 个整数的数组 nums,其中每个整数都介于 1 和 n(含)之间,证明至少存在一个重复数。假设只有一个重复号码,找到重复号码。
注意: 您不得修改数组(假设数组是只读的)。 您必须只使用常量,O(1) 额外空间。 您的运行时复杂度应小于 O(n2)。 数组中只有一个重复数,但可以重复多次。
int findDuplicate3(vector<int>& nums)
{
if (nums.size() > 1)
{
int slow = nums[0];
int fast = nums[nums[0]];
while (slow != fast)
{
slow = nums[slow];
fast = nums[nums[fast]];
}
fast = 0;
while (fast != slow)
{
fast = nums[fast];
slow = nums[slow];
}
return slow;
}
return -1;
}
【问题讨论】:
-
现在我明白你的意思了。我认为对于 nums[i]==i 的这个问题,你必须从任何其他点开始。你可以有一个外部循环来检查 nums 的位置[i]!=i 然后你可以从那个位置继续。你认为这也会中断吗?
-
如果 i!=0 则不会引起问题,因为慢速指针会卡在那个位置,而快速指针最终会到达相同的位置,while 循环将中断,并且当慢速仍然存在时,第二个 while 循环快速卡住会到达那里并找到重复项。但是当 nums[0] = 0 时,您需要单独处理这种情况。例如:int nums[] = {4,1,3,2,2} 这里 arr[1] ==1 但这不会导致问题,您可以使用笔和纸轻松解决。
-
这个算法基本行不通,
x[i]=i是它的小问题。更大的问题是它永远不会在[1,2,3,0,4,4]中看到重复项。 -
当 arr[i] == i 或者 arr[i] 是重复的时候有两种可能性,那么没有问题,上面的算法可以正常工作。第二种可能性是 arr[i ] == i 并且 arr[i] 不是重复的(比如说 i 不为零,我们可以单独处理这种情况),那么我的主张是您永远不会通过上述算法到达位置 i。如果您觉得有什么不对那请提供并反例。(再次 i==0 情况单独处理)因为我不知道如何正式地说。
-
@Khatri 这个问题似乎有一个内部矛盾,它说
x[0]==0是一个问题,所以我取 0 是允许的。如果不是,那么算法可能没问题。