540. Single Element in a Sorted Array
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.
O(logn) Solution:
class Solution:
def singleNonDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
low, high = 0, len(nums)-1
while low < high - 2:
mid = (low + high)//2
if mid%2:
if nums[mid-1] == nums[mid]:
low = mid + 1
elif nums[mid+1] == nums[mid]:
high = mid - 1
else:
return nums[mid]
else:
if nums[mid-1] == nums[mid]:
high = mid - 2
elif nums[mid+1] == nums[mid]:
low = mid + 2
else:
return nums[mid]
if nums[low] == nums[low+1]:
return nums[high]
else:
return nums[low]
解题思路:
1) 只看问题应算是medium难度里面比较简单的,难点在于要求O(logn)级别的solution.
2) O(logn)一直是一种比较不直观的时间复杂度,主要要理解时间复杂度描述的不是一个具体的耗时,而是描述随着问题的规模增加,算法的耗时增加的趋势. 因此只是描述一个大概的趋势. 比如O(3N)、O(4N)都归为O(N级别). 同样的O(logn)也没有底数,虽然大多数时候底数为2.
3) 涉及O(logn)的算法基本离不开二分法,特别是对于问题本身输入是已经排好序的数组. 可以想到问题必须通过二分解决.
4) 常见的O(logn)算法有单次的堆排序(一个新结点插入堆后在堆内调整), 二分查找, 二叉搜索树等,可以看到数据的结构都是二叉树相关结构. 因此以后设计logn的题目可以按二分法思路解决.