📝

Leetcode 287

Importance
📙📙📙
Start Date
Mar 15, 2025 09:41
tags
Hash
Link
Link:

题目要求

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。
你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
 

核心算法和原理

 
  • 看作一个链表,i -> next = nums[i]
  • 由于存在唯一重复数,则存在环
  • 用链表求环的方法得到这个环即可
  • 自环情况:由于nums[0..n] = [1, n],保证nums[0]一定不等于0,所以0一定不是自环;
  • 如果以0开头的链表存在自环,那这个自环的值即为所求;
  • 如果不存在,那要么说明所有元素都没有自环,要么说明不在0开头的链表里
 

代码

class Solution { public: int findDuplicate(vector<int>& nums) { if (nums.size() <= 2) { return nums[0]; } int slow = nums[0], fast = nums[nums[0]]; while (slow != fast) { slow = nums[slow]; fast = nums[nums[fast]]; } slow = 0; while (slow != fast) { slow = nums[slow]; fast = nums[fast]; } return slow; } };