Find Peak Element

A peak element is an element that is greater than its neighbors.

Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

You may imagine that num[-1] = num[n] = -∞.

For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.

 这也是一道神奇的题目,原本来源是geeksforgeeks,题目提示用对数时间来时间,基本只有二分了。另外题意是找到其中一个peak element,不是全部或者全局的peak元素,这也是可以使用二分的保证。另外题目提示num[-1]=num[n]=-∞也就是如果数组开头为递减序列或者结尾为递增序列,则num[0]或num[n-1]可以作为peak返回。具体思路不再是考虑left和right这样的boundary元素,而是考虑mid-1和mid+1来判断mid左边和右边的子数组的趋势。

如果num[mid-1]<num[mid]并且num[mid+1]<num[mid]。则mid本身就是一个peak元素,可以直接返回。而num[mid-1]>num[mid]时,说明左边数组有递减的趋势。如果一直是递减,则num[0]符合peak的条件,如果是先递增后递减,则可以在这块二分找到这个元素,总结就是此时取左半数组,r=mid。而当num[mid+1]>num[mid]时,可以得到类似分析,右半数组有递增趋势,如果一直递增则num[n-1]符合peek的条件,如果先递增后递减则可以通过二分找到这个数字,所以此时取右半数组,令l=mid。代码如下:

class Solution(object):
    def findPeakElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0
            
        l = 0
        r = len(nums)-1
        
        while l+1 < r:
            mid = l + (r-l)/2
            if nums[mid] < nums[mid-1]:
                r = mid
            elif nums[mid] < nums[mid+1]:
                l = mid 
            else:
                return mid 
        if nums[l] < nums[r]:
           return r
        else:
           return l

最后剩余两个元素,所以需要考虑下到底哪个是。时间复杂度为O(logn)

简化加速版本,在左侧找降的趋势,在右侧找升的趋势.题意保证左侧有降的在一定有peak,右侧有升的,则一定也有peak.

class Solution(object):
    def findPeakElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return -1
        l = 0
        r = len(nums) - 1
        while l + 1 < r:
            mid = l + (r -l)/2
            if nums[mid-1] >  nums[mid]:
                r = mid
            else:
                l = mid
        if nums[l] > nums[r]:
            return l
        else:
            return r

 

posted on 2016-05-15 23:01  Sheryl Wang  阅读(189)  评论(0编辑  收藏  举报

导航