540. Single Element in a Sorted Array
题目大意:
给你一个由小到大排好序的数组,里面只有一个数出现了一次,其他数都出现了两次,要求找出那个只出现一次的数,而且时间复杂度为O(logn)
题目思路:
说实话一开始没想到,因为几乎每个数都出现了两次那么对于一个偶数i,一定有nums[i] == nums[i+1]否则说明在这之前出现过只出现一次的数字。这样就是可以用二分查找,其实当读到题目说logn的复杂度时想都不用想是二分了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Solution: 2 def singleNonDuplicate(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: int 6 """ 7 lo = 0 8 hi = (len(nums)-1) 9 while lo < hi: 10 mi = (lo+hi)//2 11 if mi%2 != 0: 12 if nums[mi] != nums[mi-1]: 13 hi = mi-1 14 else: 15 lo = mi+1 16 else: 17 if nums[mi] != nums[mi+1]: 18 hi = mi-1 19 else: 20 lo = mi+1 21 return nums[lo]