码迷,mamicode.com
首页 > 其他好文 > 详细

287. Find the Duplicate Number

时间:2017-02-25 17:29:27      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:ext   ted   and   should   链表   contain   less   space   color   

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

 

287. Find the Duplicate Number

标签:ext   ted   and   should   链表   contain   less   space   color   

原文地址:http://www.cnblogs.com/tsunami-lj/p/6442128.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!