LeetCode 287. Find the Duplicate Number
解法一:
类似 LeetCode 442. Find All Duplicates in an Array,由于元素是1~n,因此每个元素的值-1(映射到0~n-1)就可以直接当做下标。
class Solution { public: int findDuplicate(vector<int>& nums) { for (int i=0;i<nums.size();++i){ int index=abs(nums[i])-1; if (nums[index]>0) nums[index]*=-1; else return index+1; } } };
解法二:Floyd Cycle Detection
由于元素都是1~n,而数组n+1个元素,因此下标为0~n,可以将数组元素映射到下标,而映射的过程可以抽象为链表的链接。由于有重复的元素,这里就可以用环检测的方法,和Linked List Cycle II一样。
class Solution { public: int findDuplicate(vector<int>& nums) { int slow=nums[0]; int fast=nums[0]; do { slow = nums[slow]; fast = nums[nums[fast]]; }while(slow!=fast); int p=nums[0]; int q=slow; while (p!=q){ p = nums[p]; q = nums[q]; } return p; } };

浙公网安备 33010602011771号