~/DHRUVUpskilling
← board/DSA/Binary Search/dsa-binary-search-05
Solved·12 Sept

Single Element in a Sorted Array

DifficultyMedium
PatternBinary Search
TrackDSA
tl;dr

You are given a sorted array consisting of only integers where every element appears exactly twice, except for one element which appears exactly once.

full write-up

You are given a sorted array consisting of only integers where every element appears exactly twice, except for one element which appears exactly once.

Return the single element that appears only once.

Your solution must run in O(log n) time and O(1) space.

Example 1:

Input: nums = [1,1,2,3,3,4,4,8,8] Output: 2 Example 2:

Input: nums = [3,3,7,7,10,11,11] Output: 10

Constraints:

1 <= nums.length <= 105 0 <= nums[i] <= 105

Solution

I can see a pattern here , if pattern is correct for odd index there should be same element at its left and for even index there should be a element in its right. if this pattern is broken we should move towards left

var singleNonDuplicate = function(arr) {
    let left = 0;
    let right = arr.length - 1;
    
    if(arr.length == 1) {
        return arr[0];
    }
    
    while(left < right) {
        let mid = Math.floor((left + right) / 2);
        
        let isEven = mid % 2 == 0;
        
        if(isEven && arr[mid] === arr[mid+1]) {
            left = mid + 1;
        } else if(!isEven && arr[mid] === arr[mid-1]) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    
    return arr[left];  // Also should return arr[left], not just left
};