[LeetCode]540. Single Element in a Sorted Array

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的题目可以按二分法思路解决.

猜你喜欢

转载自blog.csdn.net/m0_37422289/article/details/80309106