首页 > 技术文章 > leetcode 日记 162. Find Peak Element java python

aksdenjoy 2016-08-23 18:02 原文

根据题目可知,输入为:一个相邻元素不相等的数列,输出为:其中一个(上)峰值的序号。并且要求时间复杂度为logn

分析:由于题目要求时间复杂度为logn,因此不能进行全部遍历。又因为只需要找到其中的一个峰值,那么,每次对半分,便可以达到logn的复杂度。

   根据对半分的思路继续想,不难发现只要确定了中间位置的数是处在上升阶段还是下降阶段,就可以确定在某一侧必有一个峰值。

   往复多次,即可找出两个点,其中一个一定处于某一个峰值上。

java代码:

 1 public int findPeakElement(int []nums)
 2     {
 3         int left=0;
 4         int right=nums.length-1;
 5         if(right==0) return 0;
 6         while(left<right-1)
 7         {
 8             int mid=(left+right)/2;
 9             if (nums[mid]<nums[mid+1])//上升
10             {
11                 left=mid+1;
12             }
13             else//下降
14             {
15                 right=mid;
16             }
17         }
18         return nums[left]>nums[right]?left:right;
19     }

python代码:

def findPeakElement(self, nums):
        length=len(nums)
        if length==1:
            return 0
        left=0
        right=length-1
        while left<right-1:
            mid=(left+right)/2
            #increase
            if nums[mid]<nums[mid+1]:
                left=mid+1
            #decrease
            else:
                right=mid
        return left if nums[left]>nums[right] else right

 

推荐阅读