题目:
峰值元素是指其值大于左右相邻值的元素。
给你一个输入数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞ 。
class Solution {
/*
这两种方法都是使用了二分法的 左闭右开 [left, right)
nums[i] > nums[i + 1],主要的精髓就在这句话,为了找到峰值,就需要考虑是处于局部升序还是局部降序
当满足这个说明处于 局部降序,那么就需要往左边找,那么就有 right = mid
当不满足这句话,就说明处于 局部升序,那么就需要往右找,那么就有 left + 1 = mid
第一种方法的时间复杂度为 O(log n) 空间复杂度为 O(log n)
第二种方法的时间复杂度为 O(log n) 空间复杂度为 O(1)
第三种方法的时间复杂度为 O(n) 空间复杂度为 O(1)
*/
// // 递归 + 二分法
// public:
// int findPeakElement(vector<int>& nums)
// {
// return find_peak(nums, 0, nums.size() - 1);
// }
// private:
// int find_peak(vector<int>& nums, int left, int right)
// {
// if(left == right) return left;
// int mid = (left + right) >> 1;
// if(nums[mid] > nums[mid + 1]) return find_peak(nums, left, mid);
// return find_peak(nums, mid + 1, right);
// }
// // 迭代 + 二分法
// public:
// int findPeakElement(vector<int>& nums)
// {
// int left = 0, right = nums.size() - 1;
// while(left < right)
// {
// int mid = (left + right) >> 1;
// if(nums[mid] > nums[mid + 1]) right = mid;
// else left = mid + 1;
// }
// return left;
// }
// 线性法
// 线性法也比较好理解,从左往后遍历数组,因为从第一个开始就开始比较
// 所以如何if一直不满足,说明一直处于升,
// 一旦满足 if 则说明是到了一个峰值,直接返回,
// 否则就一直遍历到最后一个元素
public:
int findPeakElement(vector<int>& nums)
{
for(int i = 0; i < nums.size() - 1; ++i)
{
if(nums[i] > nums[i + 1]) return i;
}
return nums.size() - 1;
}
};