我正在调试下面的问题,并发布解决方案。这个问题已经在几个论坛上发帖了,但是当num[0] = 0或者一般情况下num[x] = x时,我认为解决方案存在一个bug,这种情况下请纠正我。
给定一个包含n + 1个整数的数组nums,每个整数都在1到n之间(包括1和n)。证明必然存在至少一个重复的数字。假设只有一个重复的数字,请找出这个数字。
注意: 您不能修改该数组(假设该数组是只读的)。 您必须仅使用常量O(1)的额外空间。 您的运行时间复杂度应该小于O(n2)。 数组中只有一个重复数字,但它可能重复出现多次。
给定一个包含n + 1个整数的数组nums,每个整数都在1到n之间(包括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;
}
x[i]=i
只是其中较小的问题。更大的问题是它永远不会看到[1,2,3,0,4,4]
中的重复项。 - n. m.x[0]==0
是一个问题,所以我认为0是允许的。如果不是这样的话,那么算法可能就没问题了。 - n. m.