Monday, September 23, 2019

Find Duplicate Numbers in An Integer Array

Give an array contains n+1 number which range from 1 to n. Find the duplicates.

e.g. 1, 2, 3, 3 -> 3
1, 3, 2, 4, 3 -> 3

Requirements
Space o(1)
Time o(n)

Since there are 1..n number in n+1 size array, every number can link to other using the form num -> array[num].
Note if there are duplicates amount 1 to n, then there will be different numbers links to the same number.

For example: 1->3->4->3 which forms a loop, now the problem becomes finding the starting of loop.

which can be done by https://en.wikipedia.org/wiki/Cycle_detection




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