leetcode 日记 162. Find Peak Element java python
根据题目可知,输入为:一个相邻元素不相等的数列,输出为:其中一个(上)峰值的序号。并且要求时间复杂度为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