Single Element in a Sorted Array
You are given a sorted array consisting of only integers where every element appears exactly twice, except for one element which appears exactly once.
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
};