287. Find the Duplicate Number

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.

Note:

  1. You must not modify the array (assume the array is read only).
  2. You must use only constant, O(1) extra space.
  3. Your runtime complexity should be less than O(n2).
  4. There is only one duplicate number in the array, but it could be repeated more than once.

解题思路:首先去这个博客瞻仰一下http://keithschwarz.com/interesting/code/?dir=find-duplicate

这题目的思路巧妙在把数组数值转化成了索引,也就是把顺序数组变成了链表来用。构造出链表图之后,就使得该题变成了带环链表找进入链表的入口值。至于构造出的图为什么一定有环,这是因为n个值,n+1个索引,由鸽笼原理可知,总有一个数被指了两次,也就是重复出现的值,也就是环的entry。

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

 

posted @ 2017-02-25 16:24  Tsunami_lj  阅读(126)  评论(0编辑  收藏  举报