峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums
,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞
。
你必须实现时间复杂度为 O(log n)
的算法来解决此问题。
c++解法
- class Solution {
- public:
- int findPeakElement(vector<int>& nums) {
- int left = 0, right = nums.size() - 2;
- while(left <= right){
- int mid = left + (right - left) / 2;
- if (nums[mid] < nums[mid + 1]){
- left = mid + 1;
- }else{
- right = mid - 1;
- }
- }
- return left;
- }
-
- };
java解法
- class Solution {
- public int findPeakElement(int[] nums) {
- int n = nums.length;
- int l = 0, r = n - 1;
- while (l < r) {
- int mid = l + r >> 1;
- if (nums[mid] > nums[mid + 1]) r = mid;
- else l = mid + 1;
- }
- return r;
- }
- }
本题要求数组中的峰值元素,同时要求时间复杂度为O(logn),可以想到用二分解法找到峰值。二分查找找到峰值的原理为若存在峰值元素,则该峰值必定大于左右两个数,二分查找找到的值只有可能为峰值元素故可使用二分查找完成
本题考察二分查找的应用,假设从开头到中间值到结尾均为递增,若中间值大于中间值后一位数则只考虑前半段,不断缩小范围可找到峰值,返回峰值下标即可解决