码迷,mamicode.com
首页 > 其他好文 > 详细

Find Peak Element

时间:2016-05-16 00:20:42      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

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,不是全部或者全局的peek元素,这也是可以使用二分的保证。另外题目提示num[-1]=num[n]=-∞也就是如果数组开头为递减序列或者结尾为递增序列,则num[0]或num[n-1]可以作为peek返回。具体思路不再是考虑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)

Find Peak Element

标签:

原文地址:http://www.cnblogs.com/sherylwang/p/5496555.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!