链接
https://leetcode-cn.com/problems/find-peak-element/
耗时
解题:19 min
题解:7 min
题意
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞ 。
你必须实现时间复杂度为 O(log n) 的算法来解决此问题。
提示:
1 <= nums.length <= 1000-231 <= nums[i] <= 231 - 1- 对于所有有效的
i都有nums[i] != nums[i + 1]
思路
因为nums[-1] = nums[n] = -∞,所以对于每个位置,其上升方向的一侧必有峰,即 nums[i] < nums[i+1],i+1 一侧一定有峰,nums[i] < nums[i-1],i-1 一侧一定有峰。二分之后再在上升区间二分即可。
时间复杂度: O ( l o g n ) O(logn) O(logn)
AC代码
class Solution {
public int findPeakElement(int[] nums) {
int n = nums.length;
int s = 0, t = n;
while(s < t) {
int m = (s+t)>>1;
if((m == 0 || nums[m] > nums[m-1]) && (m == n-1 || nums[m] > nums[m+1])) {
return m;
}
else if(m == 0 || (m+1 < n && nums[m] < nums[m+1])) s = m+1;
else t = m;
}
return s;
}
}

本文解析了LeetCode题目Find Peak Element,介绍了如何利用二分搜索算法在O(logn)的时间复杂度内找出数组中的峰值元素。通过递归和比较中间元素与其左右邻居的关系,逐步缩小搜索范围,最终确定峰值索引。
(二分)中等&spm=1001.2101.3001.5002&articleId=120302019&d=1&t=3&u=09b9846c6e5c4acb8c130a9e2251fe85)
382

被折叠的 条评论
为什么被折叠?



