时间复杂度:O(log n)
解题思路
爬坡法,其实就是二分查找+贪心策略。用low和high表示[low,high]区间内有峰值,只要low和high不相等就说明无法确定峰值索引,如果nums[mid]<nums[mid+1],就说明[mid+1,high]区间内有更大的值,这个值可能就是峰值,于是更新low为mid+1;否则就更新high为mid,因为nums[mid-1]和nums[mid]的大小关系未知,nums[mid]可能就是峰值,也可能nums[mid-1]比nums[mid]大,[low,mid]区间内有峰值。当low和high相等时,峰值索引已经确定,返回结果。
AC代码
func findPeakElement(nums []int) int {
low,high:=0,len(nums)-1 //low和high表示[low,high]区间内有峰值
for low<high{
mid:=low+(high-low)>>1
//mid的右侧元素大,存在峰值
if nums[mid]<nums[mid+1]{
low=mid+1 //由于mid+1元素较大,那么mid元素一定不是峰值,所以更新low为mid+1而不是mid
}else{ //(mid,high]区间不存在峰值,开始在[low,mid]区间内寻找峰值
high=mid //由于mid-1的元素大小未知,所以mid元素可能是峰值,所以更新high为mid而不是mid-1
}
}
//退出循环时low和high相等,峰值索引已经确定,返回结果
return low
}
感悟
看见logn的时间复杂度就知道是二分思想,但是如何二分没有想通,看了题解后才反应过来。但是官方题解的二分极其啰嗦,判断的条件太多,评论区的题解简洁易懂。