Find the only repeating element in a sorted array of size n (original) (raw)

Last Updated : 19 Apr, 2024

Given a sorted array of n elements containing elements in range from 1 to n-1 i.e. one element occurs twice, the task is to find the repeating element in an array.

**Examples :

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

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

**Brute Force:

  1. Traverse the input array using a for a loop.
  2. For each element in the array, traverse the remaining part of the array using another for loop.
  3. For each subsequent element, check if it is equal to the current element.
  4. If a match is found, return the current element.
  5. If no match is found, continue with the next element in the outer loop.
  6. If the outer loop completes without finding a match, return -1 to indicate that there is no repeating element in the array.

Below is the implementation of the above approach:

C++ `

// C++ program to find the only repeating element in an // array of size n and elements from range 1 to n-1. #include <bits/stdc++.h> using namespace std;

// Returns index of second appearance of a repeating element // The function assumes that array elements are in range from // 1 to n-1. int FindRepeatingElement(int arr[], int size){ for(int i=0; i<size; i++){ for(int j=i+1; j<size; j++){ if(arr[i] == arr[j]) return i; } } return -1; }

// Driver code int main() { int arr[] = {1, 2 , 3 , 4 , 4}; int n = sizeof(arr) / sizeof(arr[0]); int index = FindRepeatingElement(arr, n); if (index != -1) cout << arr[index]; return 0; }

Java

import java.util.*;

public class Main {

// Returns index of second appearance of a repeating element
// The function assumes that array elements are in range from
// 1 to n-1.
public static int findRepeatingElement(int arr[], int size){
    for(int i=0; i<size; i++){
        for(int j=i+1; j<size; j++){
            if(arr[i] == arr[j])
                return i;
        }
    }
    return -1;
}

// Driver code
public static void main(String[] args) {
    int arr[] = {1, 2 , 3 , 4 , 4};
    int n = arr.length;
    int index = findRepeatingElement(arr, n);
    if (index != -1)
        System.out.println(arr[index]);
}

}

Python3

Python3 program to find the only repeating element in an

array of size n and elements from range 1 to n-1.

Returns second appearance of a repeating element

The function assumes that array elements are in range from

1 to n-1.

def FindRepeatingElement(arr, size): for i in range(size): for j in range(i+1, size): if arr[i] == arr[j]: return arr[i] return -1

Driver code

if name == 'main': arr = [1, 2, 3, 4, 4] n = len(arr) element = FindRepeatingElement(arr, n) if element != -1: print(element)

C#

using System;

public class Program {

// Returns index of second appearance of a repeating element // The function assumes that array elements are in range from // 1 to n-1. public static int FindRepeatingElement(int[] arr, int size) { for (int i = 0; i < size; i++) { for (int j = i + 1; j < size; j++) { if (arr[i] == arr[j]) { return i; } } } return -1; }

// Driver code public static void Main() { int[] arr = { 1, 2, 3, 4, 4 }; int n = arr.Length; int index = FindRepeatingElement(arr, n); if (index != -1) { Console.WriteLine(arr[index]); } } }

JavaScript

// JavaScript program to find the only repeating element in an // array of size n and elements from range 1 to n-1.

// Returns index of second appearance of a repeating element // The function assumes that array elements are in range from // 1 to n-1. function FindRepeatingElement(arr, size) { for(let i=0; i<size; i++) { for(let j=i+1; j<size; j++) { if(arr[i] == arr[j]) return i; } } return -1; }

// Driver code let arr = [1, 2 , 3 , 4 , 4]; let n = arr.length; let index = FindRepeatingElement(arr, n); if (index != -1) console.log(arr[index]);

// This code is contributed by akashish__

`

**Time Complexity: O(N^2)
**Auxiliary Space: O(1)

An **efficient method is to use Floyd’s Tortoise and Hare algorithm.

C++ `

// C++ program to find the only repeating element in an // array of size n and elements from range 1 to n-1. #include <bits/stdc++.h> using namespace std;

// Returns the repeating element in the array // The function assumes that array elements are in range from // 1 to n-1. int FindRepeatingElement(int arr[], int size){ for(int i = 0; i < size; i++){ if(arr[abs(arr[i])] >= 0) arr[abs(arr[i])] = -arr[abs(arr[i])]; else return abs(arr[i]); } return -1; }

// Driver code int main() { int arr[] = {1,3,3,4,5,6,7,8}; int n = sizeof(arr) / sizeof(arr[0]); int repeatingElement = FindRepeatingElement(arr, n); cout << repeatingElement; return 0; }

Java

class Test { // Returns the repeating element in the array // The function assumes that array elements are in range from // 1 to n-1. static int findRepeatingElement(int arr[]){ int tortoise = arr[0]; int hare = arr[0];

    // Phase 1: Finding intersection point of Tortoise and Hare
    do {
        tortoise = arr[tortoise];
        hare = arr[arr[hare]];
    } while(tortoise != hare);
    
    // Phase 2: Finding the entrance to the cycle
    tortoise = arr[0];
    while(tortoise != hare){
        tortoise = arr[tortoise];
        hare = arr[hare];
    }
    
    return hare;
}

// Driver method
public static void main(String[] args) 
{ 
    int  arr[] = {1, 2, 3, 3, 4, 5};
    int repeatingElement = findRepeatingElement(arr); 
    System.out.println(repeatingElement); 
}

}

Python3

Python program to find the only repeating element in an

array of size n and elements from range 1 to n-1

def findRepeatingElement(arr): tortoise = arr[0] hare = arr[0]

# Phase 1: Finding intersection point of Tortoise and Hare
while True:
    tortoise = arr[tortoise]
    hare = arr[arr[hare]]
    if tortoise == hare:
        break

# Phase 2: Finding the entrance to the cycle
tortoise = arr[0]
while tortoise != hare:
    tortoise = arr[tortoise]
    hare = arr[hare]

return hare

Driver code

arr = [1, 2, 3, 3, 4, 5] repeatingElement = findRepeatingElement(arr) print(repeatingElement)

C#

// C# program to find the only repeating // element in an array of size n and // elements from range 1 to n-1. using System;

class Test { // Returns index of second appearance of a // repeating element. The function assumes that // array elements are in range from 1 to n-1. static int findRepeatingElement(int []arr, int low, int high) { // low = 0 , high = n-1; if (low > high) return -1;

    int mid = (low + high) / 2;

    // Check if the mid element 
    // is the repeating one
    if (arr[mid] != mid + 1)
    {
        if (mid > 0 && arr[mid]==arr[mid-1])
            return mid;

        // If mid element is not at its position
        // that means the repeated element is in left
        return findRepeatingElement(arr, low, mid-1);
    }

    // If mid is at proper position 
    // then repeated one is in right.
    return findRepeatingElement(arr, mid+1, high);
}

// Driver method
public static void Main() 
{
    int []arr = {1, 2, 3, 3, 4, 5};
    int index = findRepeatingElement(arr, 0, arr.Length-1);
    if (index != -1)
    Console.Write(arr[index]);
}

}

// This code is contributed by Nitin Mittal.

JavaScript

PHP

$high) return -1; mid=floor((mid = floor((mid=floor((low + $high) / 2); // Check if the mid element // is the repeating one if ($arr[$mid] != $mid + 1) { if ($mid > 0 && arr[arr[arr[mid] == arr[arr[arr[mid - 1]) return $mid; // If mid element is not at // its position that means // the repeated element is in left return findRepeatingElement($arr, $low, $mid - 1); } // If mid is at proper position // then repeated one is in right. return findRepeatingElement($arr, $mid + 1, $high); } // Driver code $arr = array(1, 2, 3, 3, 4, 5); n=sizeof(n = sizeof(n=sizeof(arr); index=findRepeatingElement(index = findRepeatingElement(index=findRepeatingElement(arr, 0, $n - 1); if ($index != -1) echo arr[arr[arr[index]; // This code is contributed // by nitin mittal. ?>

`

**Time Complexity : O(log n)

**Space Complexity: O(1)