今日记录一道较为抽象的算法题,主要体现在算法思想上的抽象------287. 寻找重复数 - 力扣(LeetCode)

首先若不考虑限制条件,便可直接使用哈希表统计各个数字出现的次数,当出现次数大于1时即为结果。
但显然该方法不是本次的主人公,需要按题目进阶要求想出一种线性级时间复杂度 O(n) ,且空间复杂度为常数级的解决方案。
此处,我们不妨将其看成一个包含节点0, n的链表:
将0看成头节点,i表示当前节点node,numsi相当于node->next,从而得到一个带环的链表,此时重复节点会作为环的入口节点。
将示例1中 1, 3, 4, 2, 2 按上述规则表示便可得到一个这样的链表。
怎样,是否觉得这个图非常的熟悉。这不就变成了查找链表入环的开始节点的问题了吗。对于该问题,可以看下博主的这篇博文:链表带环问题:判断与找出环的开始节点的巧妙解法-CSDN博客。
因此解法也就简单明了,以下时代码实现:
cpp
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int slow = 0, fast = 0;
do
{
slow = nums[slow];
fast = nums[nums[fast]];
cout << slow << " " << fast << endl;
} while (slow != fast);
slow = 0;
while (slow != fast)
{
slow = nums[slow];
fast = nums[fast];
}
return slow;
}
};