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;
    }
};

 

posted @ 2018-07-29 21:26  約束の空  阅读(102)  评论(0)    收藏  举报