力扣~162.寻找峰值 Go语言

题目链接

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
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值