版权声明:by ruohua3kou https://blog.csdn.net/ruohua3kou/article/details/88945906
注意几个限制:
- 空间o(1)
- 时间o(n^2)
- 不允许改变nums
一开始想着在空间限制范围内,用位存储,结果测试案例是超过64位的… 所以行不通
class Solution
{
public:
int findDuplicate(vector<int> &nums)
{
// 1 3 4 2 2
// 0 1 2 3 4
long long temp = 0;
long long one = 1;
for (int i = 0; i < nums.size(); i++)
{
if (temp >> nums[i] & 1)
return nums[i];
else
temp |= (one << nums[i]);
}
return -1;
}
};
利用Floyd循环的方式,142. Linked List Cycle II
因为题目是1~n的数字,所以配合索引是一个类似链表的存在。于是可以使用Floyd循环的相关解法。
关于Floyd循环成立的解析: 油管地址
class Solution
{
public:
int findDuplicate(vector<int> &nums)
{
// 1 3 4 2 2
// 0 1 2 3 4
if (nums.size() < 1)
return -1;
int slow = nums[0];
int fast = nums[nums[0]];
while (slow != fast)
{
slow = nums[slow];
fast = nums[nums[fast]];
}
fast = 0;
while (slow != fast)
{
slow = nums[slow];
fast = nums[fast];
}
return fast;
}
};