287. 寻找重复数
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。
你设计的解决方案必须不修改数组 nums 且只用常量级 O(1) 的额外空间。
来源:力扣(LeetCode)
题目不难,但是要求很严格,不修改原数组,又要求只用O(1)空间,进阶条件还要满足O(n)时间…
如果只要求O(1)空间的话,可以排序+查找,如果要求O(n)时间,可以用哈希表
如果要两者都满足的话,就需要另外的方法了,可以按照找链表环的思路去做,即把数组当作链表
想想有个叫静态链表的东西,不过我没看下去,那玩意太绕了,这题没那么复杂,因为条件都给定了,首先是数字的范围是1到n,n是length-1,所以直接用数字当下标访问数组也不会越界
于是把数组当成链表后,node = node->next;就等同于node = nums[node],到这就没了,后续的操作都和链表的思路一模一样
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int slow = 0, fast = 0;
while(1)
{
slow = nums[slow];
fast = nums[nums[fast]];
if(slow == fast)break;
}
int res = 0;
while(res!=slow)
{
res = nums[res];
slow = nums[slow];
}
return res;
}
};