Welcome to Subscribe On Youtube

540. Single Element in a Sorted Array

Description

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

Solutions

Binary search.

  • class Solution {
        public int singleNonDuplicate(int[] nums) {
            int left = 0, right = nums.length - 1;
            while (left < right) {
                int mid = (left + right) >> 1;
                // if ((mid % 2 == 0 && nums[mid] != nums[mid + 1]) || (mid % 2 == 1 && nums[mid] !=
                // nums[mid - 1])) {
                if (nums[mid] != nums[mid ^ 1]) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }
            return nums[left];
        }
    }
    
  • class Solution {
    public:
        int singleNonDuplicate(vector<int>& nums) {
            int left = 0, right = nums.size() - 1;
            while (left < right) {
                int mid = left + right >> 1;
                if (nums[mid] != nums[mid ^ 1])
                    right = mid;
                else
                    left = mid + 1;
            }
            return nums[left];
        }
    };
    
  • class Solution:
        def singleNonDuplicate(self, nums: List[int]) -> int:
            left, right = 0, len(nums) - 1
            while left < right:
                mid = (left + right) >> 1
                # Equals to: if (mid % 2 == 0 and nums[mid] != nums[mid + 1]) or (mid % 2 == 1 and nums[mid] != nums[mid - 1]):
                if nums[mid] != nums[mid ^ 1]:
                    right = mid
                else:
                    left = mid + 1
            return nums[left]
    
    
  • func singleNonDuplicate(nums []int) int {
    	left, right := 0, len(nums)-1
    	for left < right {
    		mid := (left + right) >> 1
    		if nums[mid] != nums[mid^1] {
    			right = mid
    		} else {
    			left = mid + 1
    		}
    	}
    	return nums[left]
    }
    
  • function singleNonDuplicate(nums: number[]): number {
        let left = 0,
            right = nums.length - 1;
        while (left < right) {
            const mid = (left + right) >> 1;
            if (nums[mid] != nums[mid ^ 1]) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return nums[left];
    }
    
    
  • impl Solution {
        pub fn single_non_duplicate(nums: Vec<i32>) -> i32 {
            let mut l = 0;
            let mut r = nums.len() - 1;
            while l < r {
                let mid = (l + r) >> 1;
                if nums[mid] == nums[mid ^ 1] {
                    l = mid + 1;
                } else {
                    r = mid;
                }
            }
            nums[l]
        }
    }
    
    

All Problems

All Solutions