540. Single Element in a Sorted Array

T: O(logn)
class Solution {
    public int singleNonDuplicate(int[] nums) {
        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {
            if (left == right) { // when equal -> find the only one number
                return nums[left];
            }
            int mid = left + (right - left)/2;
            if (nums[mid] != nums[mid-1] && nums[mid] != nums[mid+1]) { // not equal to neighbor -> find the only one number
                return nums[mid];
            } else if (nums[mid] == nums[mid-1]) { // ex: [1,1,2,3,3,4,4,8,8]
                int leftPart = mid - 1 - left;
                if (leftPart % 2 == 1) {
                    right = mid - 2;
                } else {
                    left = mid + 1;
                }
            } else if (nums[mid] == nums[mid+1]) {
                int rightPart = right - (mid + 1);
                if (rightPart % 2 == 1) {
                    left = mid + 2;
                } else {
                    right = mid - 1;
                }
            }
        }
        return -1;
     }
}

/**
T: O(logn)

ex: else if (nums[mid] == nums[mid-1])
 0 1 2 3
[1,1,2,3,3,4,4,8,8]
         m
     r
 l     

ex: else if (nums[mid] == nums[mid+1])
0 1 2 3 4
1 1 3 3 4
    m 
 */

Last updated

Was this helpful?