540. Single Element in a Sorted Array
题目大意:
给你一个由小到大排好序的数组,里面只有一个数出现了一次,其他数都出现了两次,要求找出那个只出现一次的数,而且时间复杂度为O(logn)
题目思路:
说实话一开始没想到,因为几乎每个数都出现了两次那么对于一个偶数i,一定有nums[i] == nums[i+1]否则说明在这之前出现过只出现一次的数字。这样就是可以用二分查找,其实当读到题目说logn的复杂度时想都不用想是二分了


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]