[leetcode] 287. Find the Duplicate Number

原创 2015年11月19日 15:18:00

Given an arraynums containingn + 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. Youmust 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 thanO(n2).

  4. There is only one duplicate number in the array, but it could be repeated more than once.


这道题要找出特定数组中重复出现的元素,要求空间复杂度O(1),因此不能用HashTable,同时要求时间复杂度低于O(n2),所以也不能用两层循环暴力比对,题目难度为Hard。

思考很久始终没想到合适的办法,查看别人的做法后恍然大悟,由于数组元素的特殊性,可以采用快慢指针的方法解决(能否想到这里是关键!!)。关于快慢指针请查看第141和142题的解释。

数组中元素在1和n之间,因此遍历数组时可以拿当前元素的数值作为下一元素的下标,这样就把数组串联起来形成了一个链表。由于存在重复元素,所以链表中必定存在回环,重复元素就是回环的入口,这就把问题转化成了第142题。看到这里,大家应该不难解决这道题了。具体代码:

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

        do {
            slow = nums[slow];
            fast = nums[nums[fast]];
        } while(slow != fast);

        fast = 0;
        do {
            slow = nums[slow];
            fast = nums[fast];
        } while(slow != fast);
        
        return slow;
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode 287. Find the Duplicate Number 题解(C++)

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro...

leetcode 287. Find the Duplicate Number

参考博客:https://segmentfault.com/a/1190000003817671  里面介绍很多方法,而且都给出空间和时间复杂度。  选用最后一种方法,学到新算法。Floy...

【LeetCode】287.Find the Duplicate Number解题报告

【LeetCode】287.Find the Duplicate Number解题报告tags: Array 题目地址:https://leetcode.com/problems/find-the-d...

leetcode287. Find the Duplicate Number

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), pro...
  • sxs11
  • sxs11
  • 2017年02月26日 22:38
  • 100

[Leetcode]287. Find the Duplicate Number简单解法及解释 双指针复杂度O(n)

题目链接:Find the Duplicate Number Given an array nums containing n + 1 integers where each integer is...

LeetCode 287. Find the Duplicate Number

LeetCode 287. Find the Duplicate Number 两种解法c++

Leetcode——287. Find the Duplicate Number

题目Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), p...

leetcode 【287 Find the Duplicate Number】【Python】

本题同样让我们找数组中重复的数字,但是给出了很多限制条件。其实leetcode好像对一些限制条件,无法做出判断,我们还是自我严格要求的好哦!首先,第一个不可以改变数组,其实这个就是限制了我们排序,如果...

287. Find the Duplicate Number [Leetcode]

这题首先想到的最简单的方法是用快排然后再遍历。 然而题目要求不能改变原来的数组顺序。 所以快排的方法被排除。 后来想到了用binary search来做。 方法一:Binary Search ...

LeetCode题解(Week 1):287. Find the Duplicate Number

题目:Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[leetcode] 287. Find the Duplicate Number
举报原因:
原因补充:

(最多只允许输入30个字)