Skip to content
Related Articles

Related Articles

Improve Article
Find duplicate in an array in O(n) and by using O(1) extra space
  • Difficulty Level : Medium
  • Last Updated : 18 Mar, 2021

Given an array arr[] containing n + 1 integers where each integer is between 1 and n (inclusive). There is only one duplicate element, find the duplicate element in O(n) time complexity and O(1) space.
Examples : 
 

Input  : arr[] = {1, 4, 3, 4, 2} 
Output : 4

Input  : arr[] = {1, 3, 2, 1}
Output : 1

 

Approach : 
Firstly, the constraints of this problem imply that a cycle must exist. Because each number in an array arr[] is between 1 and n, it will necessarily point to an index that exists. Therefore, the list can be traversed infinitely, which implies that there is a cycle. Additionally, because 0 cannot appear as a value in an array arr[], arr[0] cannot be part of the cycle. Therefore, traversing the array in this manner from arr[0] is equivalent to traversing a cyclic linked list. The problem can be solved just like linked list cycle.
Below is the implementation of above approach: 
 

C++




// CPP code to find the repeated elements
// in the array where every other is present once
#include <iostream>
using namespace std;
 
// Function to find duplicate
int findDuplicate(int arr[])
{
    // Find the intersection point of
    // the slow and fast.
    int slow = arr[0];
    int fast = arr[0];
    do
    {
        slow = arr[slow];
        fast = arr[arr[fast]];
    } while (slow != fast);
 
    // Find the "entrance" to the cycle.
    int ptr1 = arr[0];
    int ptr2 = slow;
    while (ptr1 != ptr2)
    {
        ptr1 = arr[ptr1];
        ptr2 = arr[ptr2];
    }
 
    return ptr1;
}
 
// Driver code
int main()
{
    int arr[] = { 1, 3, 2, 1 };
     
    cout << findDuplicate(arr) << endl;
     
    return 0;
}

Java




// Java code to find the repeated
// elements in the array where
// every other is present once
import java.util.*;
 
class GFG
{
 
// Function to find duplicate
public static int findDuplicate(int []arr)
{
    // Find the intersection
    // point of the slow and fast.
    int slow = arr[0];
    int fast = arr[0];
    do
    {
        slow = arr[slow];
        fast = arr[arr[fast]];
    } while (slow != fast);
 
    // Find the "entrance"
    // to the cycle.
    int ptr1 = arr[0];
    int ptr2 = slow;
    while (ptr1 != ptr2)
    {
        ptr1 = arr[ptr1];
        ptr2 = arr[ptr2];
    }
 
    return ptr1;
}
 
// Driver Code
public static void main(String[] args)
{
    int []arr = {1, 3, 2, 1};
 
    System.out.println("" +
               findDuplicate(arr));
 
    System.exit(0);
}
}
 
// This code is contributed
// by Harshit Saini

Python3




# Python code to find the
# repeated elements in the
# array where every other
# is present once
 
# Function to find duplicate
def findDuplicate(arr):
 
    # Find the intersection
    # point of the slow and fast.
    slow = arr[0]
    fast = arr[0]
    while True:
        slow = arr[slow]
        fast = arr[arr[fast]]
        if slow == fast:
            break
 
    # Find the "entrance"
    # to the cycle.
    ptr1 = arr[0]
    ptr2 = slow
    while ptr1 != ptr2:
        ptr1 = arr[ptr1]
        ptr2 = arr[ptr2]
         
    return ptr1
     
# Driver code
if __name__ == '__main__':
     
     
    arr = [ 1, 3, 2, 1 ]
 
    print(findDuplicate(arr))
 
 
# This code is contributed
# by Harshit Saini

C#




// C# code to find the repeated
// elements in the array where
// every other is present once
using System;
 
class GFG
{
 
// Function to find duplicate
public static int findDuplicate(int []arr)
{
    // Find the intersection
    // point of the slow and fast.
    int slow = arr[0];
    int fast = arr[0];
    do
    {
        slow = arr[slow];
        fast = arr[arr[fast]];
    } while (slow != fast);
 
    // Find the "entrance"
    // to the cycle.
    int ptr1 = arr[0];
    int ptr2 = slow;
    while (ptr1 != ptr2)
    {
        ptr1 = arr[ptr1];
        ptr2 = arr[ptr2];
    }
 
    return ptr1;
}
 
// Driver Code
public static void Main()
{
    int[] arr = {1, 3, 2, 1};
 
    Console.WriteLine("" +
            findDuplicate(arr));
 
}
}
 
// This code is contributed
// by Akanksha Rai(Abby_akku)

PHP




<?php
// PHP code to find the repeated
// elements in the array where
// every other is present once
 
// Function to find duplicate
function findDuplicate(&$arr)
{
    $slow = $arr[0];
    $fast = $arr[0];
    do
    {
        $slow = $arr[$slow];
        $fast = $arr[$arr[$fast]];
    } while ($slow != $fast);
 
    // Find the "entrance"
    // to the cycle.
    $ptr1 = $arr[0];
    $ptr2 = $slow;
    while ($ptr1 != $ptr2)
    {
        $ptr1 = $arr[$ptr1];
        $ptr2 = $arr[$ptr2];
    }
 
    return $ptr1;
}
 
// Driver code
$arr = array(1, 3, 2, 1);
echo " " . findDuplicate($arr);
 
// This code is contributed
// by Shivi_Aggarwal
?>

Javascript




<script>
// JavaScript code to find the repeated elements
// in the array where every other is present once
 
// Function to find duplicate
function findDuplicate(arr)
{
 
    // Find the intersection point of
    // the slow and fast.
    let slow = arr[0];
    let fast = arr[0];
    do
    {
        slow = arr[slow];
        fast = arr[arr[fast]];
    } while (slow != fast);
 
    // Find the "entrance" to the cycle.
    let ptr1 = arr[0];
    let ptr2 = slow;
    while (ptr1 != ptr2)
    {
        ptr1 = arr[ptr1];
        ptr2 = arr[ptr2];
    }
    return ptr1;
}
 
// Driver code
    let arr = [ 1, 3, 2, 1 ];
    document.write(findDuplicate(arr) + "<br>");
     
// This code is contributed by Surbhi Tyagi.
</script>
Output: 
1

 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live




My Personal Notes arrow_drop_up
Recommended Articles
Page :