Leetcode - Find Peak Element

本文介绍了一种寻找峰值元素的方法,通过暴力法和二分查找法来定位数组中的峰值元素位置。峰值元素是指比其相邻元素大的元素,对于边界元素,只需要考虑一侧的相邻元素。文章给出了两种实现方式的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[分析] 暴力法,按序扫描数组,找到peak element。提示说复杂度可以是logN级别的,那就要二分查找了,如何进行二分呢?考察nums[mid]和其左右相邻元素:若nums[mid] < nums[mid + 1], 则右侧必存在一个局部最大值,简略证明:若右侧一直是升序,则最后一个元素是peak element, 否则,第一次升序的波峰处是一个peak element。同理,若num[mid] < nums[mid - 1], 则左侧必存在一个局部最大值。若前面两种情况都不成立,则mid处就是一个局部最大值。


public class Solution {
public int findPeakElement1(int[] nums) {
if (nums == null || nums.length == 0)
return -1;
if (nums.length == 1)
return 0;
int N = nums.length;
for (int i = 1; i < N - 1; i++) {
if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1])
return i;
}
if (nums[0] > nums[1])
return 0;
else if (nums[N - 1] > nums[N - 2])
return N - 1;
else
return -1;
}

public int findPeakElement(int[] nums) {
if (nums == null || nums.length == 0)
return -1;
if (nums.length == 1 || nums[0] > nums[1])
return 0;
int N = nums.length;
int left = 0, right = N - 1;
while (right >= left) {
if (left == right)
return left;
int mid = left + (right - left) / 2;
if (nums[mid] < nums[mid + 1])
left = mid + 1;
else if (nums[mid] < nums[mid - 1])
right = mid - 1;
else
return mid;
}
return -1;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值