题目链接
https://leetcode.cn/problems/find-peak-element/
题目描述
解法一(顺序法)
顺序遍历数组。本题的一个重要特点是提示三中相邻两个元素不相等,那么从第一个元素开始,若其大于相邻的后续元素,则第一个元素就是一个局部最大值,返回即可。若其小于相邻的后续元素,则第二个元素大于第一个元素。如此,一一遍历数组,第一次出现,第i个元素若大于其相邻后续元素,则该元素就是一个局部最大值,返回即可。
时间复杂度为O(n)
代码
func findPeakElement(nums []int) int {
x := 0
for i := 0; i < len(nums)-1; i++ { //遍历到倒数第二个元素 因为遍历到最后一个索引i+1就超出了
if nums[i] > nums[i+1] {
x = i
break
} else {
x = len(nums) - 1 //到这一步说明最后一个元素是最大的 如{1,2} 返回索引1
}
}
return x
}
解法二(二分法)
代码
func findPeakElement(nums []int) int {
left := 0
right := len(nums) - 1
get := func(i int) int {
if i == -1 || i == len(nums) {
return -100000000000000000 //这个数只要是⽐-2^31 ⼩就可以
}
return nums[i]
}
for { // 注意,此时for循环条件不是left< right,因为可能需要
//重复⼀遍或者多遍遍历这个数组
mid := left + (right-left)/2
if get(mid) > get(mid-1) && get(mid) > get(mid+1) {
return mid
} else if get(mid) < get(mid+1) {
left = mid + 1
} else {
right = mid - 1
}
}
}