Given a sorted array in which all elements appear twice (one after one) and one element appears only once. Find that element in O(log n) complexity.

**Example: **

Input: arr[] = {1, 1, 3, 3, 4, 5, 5, 7, 7, 8, 8} Output: 4 Input: arr[] = {1, 1, 3, 3, 4, 4, 5, 5, 7, 7, 8} Output: 8

A **Simple Solution** is to traverse the array from left to right. Since the array is sorted, we can easily figure out the required element.

An **Efficient Solution** can find the required element in O(Log n) time. The idea is to use Binary Search. Below is an observation in input array.

All elements before the required have first occurrence at even index (0, 2, ..) and next occurrence at odd index (1, 3, …). And all elements after the required element have first occurrence at odd index and next occurrence at even index.

1) Find the middle index, say ‘mid’.

2) If ‘mid’ is even, then compare arr[mid] and arr[mid + 1]. If both are same, then the required element after ‘mid’ else before mid.

3) If ‘mid’ is odd, then compare arr[mid] and arr[mid – 1]. If both are same, then the required element after ‘mid’ else before mid.

Below is the implementation based on above idea.

## C/C++

`// C program to find the element that appears only once ` `#include<stdio.h> ` ` ` `// A Binary Search based function to find the element ` `// that appears only once ` `void` `search(` `int` `*arr, ` `int` `low, ` `int` `high) ` `{ ` ` ` `// Base cases ` ` ` `if` `(low > high) ` ` ` `return` `; ` ` ` ` ` `if` `(low==high) ` ` ` `{ ` ` ` `printf` `(` `"The required element is %d "` `, arr[low]); ` ` ` `return` `; ` ` ` `} ` ` ` ` ` `// Find the middle point ` ` ` `int` `mid = (low + high) / 2; ` ` ` ` ` `// If mid is even and element next to mid is ` ` ` `// same as mid, then output element lies on ` ` ` `// right side, else on left side ` ` ` `if` `(mid%2 == 0) ` ` ` `{ ` ` ` `if` `(arr[mid] == arr[mid+1]) ` ` ` `search(arr, mid+2, high); ` ` ` `else` ` ` `search(arr, low, mid); ` ` ` `} ` ` ` `else` `// If mid is odd ` ` ` `{ ` ` ` `if` `(arr[mid] == arr[mid-1]) ` ` ` `search(arr, mid+1, high); ` ` ` `else` ` ` `search(arr, low, mid-1); ` ` ` `} ` `} ` ` ` `// Driver program ` `int` `main() ` `{ ` ` ` `int` `arr[] = {1, 1, 2, 4, 4, 5, 5, 6, 6}; ` ` ` `int` `len = ` `sizeof` `(arr)/` `sizeof` `(arr[0]); ` ` ` `search(arr, 0, len-1); ` ` ` `return` `0; ` `} ` |

## Java

`// Java program to find the element that appears only once ` ` ` `public` `class` `Main ` `{ ` ` ` `// A Binary Search based method to find the element ` ` ` `// that appears only once ` ` ` `public` `static` `void` `search(` `int` `[] arr, ` `int` `low, ` `int` `high) ` ` ` `{ ` ` ` `if` `(low > high) ` ` ` `return` `; ` ` ` `if` `(low == high) ` ` ` `{ ` ` ` `System.out.println(` `"The required element is "` `+arr[low]); ` ` ` `return` `; ` ` ` `} ` ` ` ` ` `// Find the middle point ` ` ` `int` `mid = (low + high)/` `2` `; ` ` ` ` ` `// If mid is even and element next to mid is ` ` ` `// same as mid, then output element lies on ` ` ` `// right side, else on left side ` ` ` `if` `(mid % ` `2` `== ` `0` `) ` ` ` `{ ` ` ` `if` `(arr[mid] == arr[mid+` `1` `]) ` ` ` `search(arr, mid+` `2` `, high); ` ` ` `else` ` ` `search(arr, low, mid); ` ` ` `} ` ` ` `// If mid is odd ` ` ` `else` `if` `(mid % ` `2` `== ` `1` `) ` ` ` `{ ` ` ` `if` `(arr[mid] == arr[mid-` `1` `]) ` ` ` `search(arr, mid+` `1` `, high); ` ` ` `else` ` ` `search(arr, low, mid-` `1` `); ` ` ` `} ` ` ` `} ` ` ` ` ` `public` `static` `void` `main(String[] args) ` ` ` `{ ` ` ` `int` `[] arr = {` `1` `, ` `1` `, ` `2` `, ` `4` `, ` `4` `, ` `5` `, ` `5` `, ` `6` `, ` `6` `}; ` ` ` `search(arr, ` `0` `, arr.length-` `1` `); ` ` ` `} ` `} ` `// This code is contributed by Tanisha Mittal ` |

## Python

`# A Binary search based function to find ` `# the element that appears only once ` `def` `search(arr, low, high): ` ` ` ` ` `# Base cases ` ` ` `if` `low > high: ` ` ` `return` `None` ` ` ` ` `if` `low ` `=` `=` `high: ` ` ` `return` `arr[low] ` ` ` ` ` `# Find the middle point ` ` ` `mid ` `=` `low ` `+` `(high ` `-` `low)` `/` `2` ` ` ` ` `# If mid is even and element next to mid is ` ` ` `# same as mid, then output element lies on ` ` ` `# right side, else on left side ` ` ` `if` `mid` `%` `2` `=` `=` `0` `: ` ` ` ` ` `if` `arr[mid] ` `=` `=` `arr[mid` `+` `1` `]: ` ` ` `return` `search(arr, mid` `+` `2` `, high) ` ` ` `else` `: ` ` ` `return` `search(arr, low, mid) ` ` ` ` ` `else` `: ` ` ` `# if mid is odd ` ` ` `if` `arr[mid] ` `=` `=` `arr[mid` `-` `1` `]: ` ` ` `return` `search(arr, mid` `+` `1` `, high) ` ` ` `else` `: ` ` ` `return` `search(arr, low, mid` `-` `1` `) ` ` ` ` ` `# Test Array ` `arr ` `=` `[ ` `1` `, ` `1` `, ` `2` `, ` `4` `, ` `4` `, ` `5` `, ` `5` `, ` `6` `, ` `6` `] ` ` ` `# Function call ` `result ` `=` `search(arr, ` `0` `, ` `len` `(arr)` `-` `1` `) ` ` ` `if` `result ` `is` `not` `None` `: ` ` ` `print` `"The required element is %d"` `%` `result ` `else` `: ` ` ` `print` `"Invalid Array"` |

## C#

`// C# program to find the element ` `// that appears only once ` `using` `System; ` ` ` `class` `GFG { ` ` ` ` ` `// A Binary Search based ` ` ` `// method to find the element ` ` ` `// that appears only once ` ` ` `public` `static` `void` `search(` `int` `[] arr, ` ` ` `int` `low, ` ` ` `int` `high) ` ` ` `{ ` ` ` ` ` `if` `(low > high) ` ` ` `return` `; ` ` ` `if` `(low == high) ` ` ` `{ ` ` ` `Console.WriteLine(` `"The required element is "` ` ` `+arr[low]); ` ` ` `return` `; ` ` ` `} ` ` ` ` ` `// Find the middle point ` ` ` `int` `mid = (low + high)/2; ` ` ` ` ` `// If mid is even and element ` ` ` `// next to mid is same as mid ` ` ` `// then output element lies on ` ` ` `// right side, else on left side ` ` ` `if` `(mid % 2 == 0) ` ` ` `{ ` ` ` `if` `(arr[mid] == arr[mid + 1]) ` ` ` `search(arr, mid + 2, high); ` ` ` `else` ` ` `search(arr, low, mid); ` ` ` `} ` ` ` ` ` `// If mid is odd ` ` ` `else` `if` `(mid % 2 == 1) ` ` ` `{ ` ` ` `if` `(arr[mid] == arr[mid - 1]) ` ` ` `search(arr, mid + 1, high); ` ` ` `else` ` ` `search(arr, low, mid - 1); ` ` ` `} ` ` ` `} ` ` ` ` ` `// Driver Code ` ` ` `public` `static` `void` `Main(String[] args) ` ` ` `{ ` ` ` `int` `[] arr = {1, 1, 2, 4, 4, 5, 5, 6, 6}; ` ` ` `search(arr, 0, arr.Length - 1); ` ` ` `} ` `} ` ` ` `// This code is contributed by Nitin Mittal. ` |

## PHP

`<?php ` `// PHP program to find the element ` `// that appears only once ` ` ` `// A Binary Search based function ` `// to find the element that ` `// appears only once ` `function` `search(` `$arr` `, ` `$low` `, ` `$high` `) ` `{ ` ` ` ` ` `// Base cases ` ` ` `if` `(` `$low` `> ` `$high` `) ` ` ` `return` `; ` ` ` ` ` `if` `(` `$low` `==` `$high` `) ` ` ` `{ ` ` ` `echo` `(` `"The required element is "` `); ` ` ` `echo` `$arr` `[` `$low` `] ; ` ` ` `return` `; ` ` ` `} ` ` ` ` ` `// Find the middle point ` ` ` `$mid` `= (` `$low` `+ ` `$high` `) / 2; ` ` ` ` ` `// If mid is even and element ` ` ` `// next to mid is same as mid, ` ` ` `// then output element lies on ` ` ` `// right side, else on left side ` ` ` `if` `(` `$mid` `% 2 == 0) ` ` ` `{ ` ` ` `if` `(` `$arr` `[` `$mid` `] == ` `$arr` `[` `$mid` `+ 1]) ` ` ` `search(` `$arr` `, ` `$mid` `+ 2, ` `$high` `); ` ` ` `else` ` ` `search(` `$arr` `, ` `$low` `, ` `$mid` `); ` ` ` `} ` ` ` ` ` `// If mid is odd ` ` ` `else` ` ` `{ ` ` ` `if` `(` `$arr` `[` `$mid` `] == ` `$arr` `[` `$mid` `- 1]) ` ` ` `search(` `$arr` `, ` `$mid` `+ 1, ` `$high` `); ` ` ` `else` ` ` `search(` `$arr` `, ` `$low` `, ` `$mid` `- 1); ` ` ` `} ` `} ` ` ` ` ` `// Driver Code ` ` ` `$arr` `= ` `array` `(1, 1, 2, 4, 4, 5, 5, 6, 6); ` ` ` `$len` `= sizeof(` `$arr` `); ` ` ` `search(` `$arr` `, 0, ` `$len` `- 1); ` ` ` `// This code is contributed by nitin mittal ` `?> ` |

Output:

The required element is 2

Time Complexity: O(Log n)

This article is contributed by Mehboob Elahi. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above

## Recommended Posts:

- K-th Element of Two Sorted Arrays
- Find the only repeating element in a sorted array of size n
- Find the element before which all the elements are smaller than it, and after which all are greater
- Square root of an integer
- Find the odd appearing element in O(Log n) time
- Find a pair with maximum product in array of Integers
- K'th largest element in a stream
- Find the nearest smaller numbers on left side in an array
- The Skyline Problem using Divide and Conquer algorithm
- Find the missing number in Arithmetic Progression
- Sort an array according to the order defined by another array
- Binary Search
- Find the element that appears once
- Count number of occurrences (or frequency) in a sorted array
- Search an element in a sorted and rotated array