Given a sorted array consisting of only integers where every element appears twice except for one element which appears once. Find this single element that appears only once.
Example 1:
Input: [1, 1, 2, 3, 3, 4, 4, 8, 8] Output: 2
Example 2:
Input: [3, 3, 7, 7, 10, 11, 11] Output: 10
Note: Your solution should run in O(log n) time and O(1) space.
题目的意思是要我们在一个给定的有序数组nums中找出只出现过一次的数,而且这个数组很特殊,所有数都出现过2次,只有1个数出现了一次。这题本身并不难,难的是题目限定了复杂度,这样的话遍历显然是不符合要求,O(log n)的复杂度提示了我们要用分治的方法,每次用下标 i 将一个数组截成两半,左右两半不可能同时存在只出现一次的数,通过比较当前数组的长度和 nums[i] 和 nums[i-1]的关系,找出符合条件的那一半作为参数递归调用自用的函数即可。为了保证 nums[i - 1]有效,我们对 nums长度等于1的情况做了特殊处理。
代码如下:
class Solution(object): def singleNonDuplicate(self, nums): print(nums) if len(nums) == 1: return nums[0] if len(nums) == 3: if(nums[1] == nums[0]): return nums[2] else: return nums[0] mid = len(nums) // 2 print(mid) if mid % 2 == 0: if nums[mid] == nums[mid - 1]: return self.singleNonDuplicate(nums[0:mid - 1]) else: return self.singleNonDuplicate(nums[mid:]) else: if nums[mid] == nums[mid - 1]: return self.singleNonDuplicate(nums[mid + 1:]) else: return self.singleNonDuplicate(nums[0:mid ])