Grokking Oracle Coding Interview
Ask Author
Back to course home

0% completed

Vote For New Content
Solution: Single Element in a Sorted Array
Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Problem Statement

Given a sorted integer array nums in which each element appears exactly twice, and only 1 element appears exactly once, return the single element that appears only once.

Note: You must solve the problem in O(log n) time and O(1) space.

Examples

  1. Example 1:

    • Input: nums = [4,4,6,6,10,11,11]
    • Expected Output: 10
    • Justification: Here, 10 is the only number that doesn't have a pair.
  2. Example 2:

    • Input: nums = [1,1,2,3,3,4,4]
    • Expected Output: 2
    • Justification: 2 is unique as it does not repeat, making it a single element.
  3. Example 3:

    • Input: nums = [5,7,7,8,8,10,10]
    • Expected Output: 5
    • Justification: 5 stands out as it's the only element without a duplicate in the sorted array.

Solution

To solve this problem, we will use a binary search technique that leverages the sorted nature of the array to efficiently find the single element. The intuition behind our approach is that the unique element causes a shift in the pattern of indices for the repeating elements. Before the single element, the first occurrence of each element is at an even index, and the second occurrence is at an odd index. After the single element, this pattern reverses because the single element takes up only one position, shifting the index of subsequent elements.

This observation allows us to effectively halve the search space at each step by examining the mid-point of our search boundaries and comparing it with its neighbors. If the pattern holds at the midpoint, we know the single element is further to the right; otherwise, it's to the left. This method is not only efficient but also leverages the given conditions to minimize the search space quickly, ensuring we meet the desired logarithmic time complexity.

Step-by-Step Algorithm

  1. Initialize Two Pointers: Start by setting left to 0 and right to the last index of the array (nums.length - 1).

  2. Begin Binary Search: Enter a loop that continues while left is less than right. This condition ensures we don't overrun the search space and stops when the single element is isolated.

  3. Calculate Midpoint: Inside the loop, calculate the midpoint (mid) as the average of left and right. This is the index we'll check to decide which half of the array contains the single element.

  4. Check Parity of Midpoint Index: Determine if mid is even or odd.

    • If mid is even and the element at mid is equal to the element at mid + 1, then the single element must be to the right, so adjust left to mid + 2.

    • If mid is even and the element at mid is not equal to the element at mid + 1, then the single element is on the left side or at mid, so adjust right to mid.

    • If mid is odd and the element at mid is equal to the element at mid - 1, then the single element is to the right, so adjust left to mid + 1.

    • If mid is odd and the element at mid is not equal to the element at mid - 1, then the single element is on the left side or at mid, so adjust right to mid.

  5. Find the Single Element: The loop terminates when left equals right. At this point, nums[left] (or nums[right] since left == right) is the single element that does not have a pair in the array.

Algorithm Walkthrough

Let's consider the input: nums = [5,7,7,8,8,10,10]

  1. Initialization:

    • left = 0
    • right = 6 (array length - 1)
  2. First Iteration:

    • mid = (0 + 6) / 2 = 3
    • mid is odd.
    • nums[mid] = 8, nums[mid - 1] = 7. Since they are not equal and mid is odd, set right = mid = 3.
  3. Second Iteration:

    • left = 0, right = 3
    • mid = (0 + 3) / 2 = 1
    • mid is odd.
    • nums[mid] = 7, nums[mid - 1] = 3. Since they are not equal and mid is odd, set right = mid = 1.
  4. Third Iteration:

    • left = 0, right = 1
    • mid = (0 + 1) / 2 = 0
    • mid is even.
    • nums[mid] = 5, nums[mid + 1] = 7. Since they are not equal and mid is even, set right = mid = 0.
    • Loop breaks as left is equal to right.
  5. Conclusion:

    • At this point, left = right = 0, and the single element is nums[left] = 5.

Code

Python3
Python3

. . . .

Complexity Analysis

Time Complexity: O(log n)

The algorithm uses a binary search technique, dividing the search space in half at each step. This results in a logarithmic time complexity, as the number of elements to be examined reduces by half after each iteration.

Space Complexity: O(1)

The space complexity is constant because the algorithm only requires a fixed amount of space regardless of the input size.

.....

.....

.....

Like the course? Get enrolled and start learning!

Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible