Leetcode 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

非常好的题目,开始是用二分做的,比如取数组为{1,2,3,3,4,5},mid应该是(5+1)/2 = 3,那么,如果小于等于mid的数的个数如果超过了3,那么重复的数字一定出现在[l,mid]之间,否则出现在[mid + 1,r]之间。以该数组为例,中位数为3,小于等于3的数一共有4个,大于3的数有两个,所以重复的数字在[1,3]之间。

发现效率挺感人的,看了一下discuss,恍然大悟,这题和142本质是一样的!

http://blog.csdn.net/accepthjp/article/details/53213998

这里说一下怎么转化成链表找环,把数组中的每一个下标和对应的数看成有向图中一个点到另一个点的边。

如果有一个数重复出现,那么一定有多个点指向它,因为它自己又必须指向一个数,那么这里面一定存在一个以他为起点的环,接下来只要找到这个换就行了。

一旦转化成142,后面应该就知道怎么做了,详细推导见上面的142题链接。

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值