链接
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;
}
}