# 540. Single Element in a Sorted Array ###### tags: `Leetcode` `Medium` `Binary Search` Link: https://leetcode.com/problems/single-element-in-a-sorted-array/ ## 思路 $O(logN)$ $O(1)$ binary search Suppose array is [1, 1, 2, 2, 3, 3, 4, 5, 5] we can observe that for each pair, first element takes even position and second element takes odd position for example, 1 is appeared as a pair, so it takes 0 and 1 positions. similarly for all the pairs also. this pattern will be missed when single element is appeared in the array. 所以我们就是要找第一个miss掉这个pattern的数字就是答案 Q: 为什么end的起始值是nums.length-1,而不是nums.length呢? A: 因为如果用nums.length的话,nums = [1],就会出问题 Q: 但这样搜寻的范围变成了左闭右开区间0到nums.length-1,为什么还是能找到正确答案呢 A: 因为在其他情况下start的范围是0到nums.length,但这题start的范围只有0到nums.length-1,也就是说它一定能找得到答案,**只有一定能找得到答案的时候才可以把end从nums.length改成nums.length-1** 这里类似于[0162. Find Peak Element](https://hackmd.io/NoxhXDOETuOXKM72I9hFhw) ## Code ```java= class Solution { public int singleNonDuplicate(int[] nums) { int start = 0; int end = nums.length-1; while(start<end){ int mid = (end-start)/2+start; if((mid%2==0 && nums[mid]==nums[mid+1])||(mid%2==1 && nums[mid-1]==nums[mid])){ start = mid+1; } else{ end = mid; } } return nums[start]; } } ```