LeetCode – Find the Duplicate Number (Java)

Given an array 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(n^2).
4) There is only one duplicate number in the array, but it could be repeated more than once.

Java Solution – Finding Cycle

The following shows how fast and slow pointers solution works. It basically contains 2 steps: 1) find the meeting point 2) start from the beginning and the meeting point respectively and find the intersection point.

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

If we can assume there is only one duplicate number, it can be easily solved by using the sum of the array.

public int findDuplicate(int[] nums) {
    int sum = 0;
    for(int i: nums){
        sum+=i;
    }
 
    int n=nums.length;
    return sum - ((n-1)*n)/2;
}

14 thoughts on “LeetCode – Find the Duplicate Number (Java)”

  1. Thanks.
    However, I’m familiar with the problem… actually is one of my favorite proofs… my comment was related only to the picture. In my imho is highly unlikely to understand the correctness from it, and that’s why I’ve added the link (see above) where it is nicely explained.

  2. this algorithm based (loosely ) on famous / finding loop in linked list /
    where some element point on other element before

    solution was

    #1 use 1step, 2step pointers, obviously they will meet. inside loop

    #2 run cycle again,to find length of loop, lets say K elements, keep pointer

    #3 pointer from start of list run K steps

    #4 run both pointers , 1step each, as soon as they meet , its start of loop!!!

    i am not sure about this simple solution finding /find/ .2d while.

    need think more!!!!!!!

  3. Check the requirements again:
    There is only one duplicate number in the array, but it could be repeated more than once.

Leave a Comment