LeetCode162. 寻找峰值

LeetCode162. 寻找峰值

【中等】【C++】
峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

示例 1:

输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入:nums = [1,2,1,3,5,6,4]
输出:1 或 5 
解释:你的函数可以返回索引 1,其峰值元素为 2;
     或者返回索引 5, 其峰值元素为 6。

提示:

1 <= nums.length <= 1000
-231 <= nums[i] <= 231 - 1
对于所有有效的 i 都有 nums[i] != nums[i + 1]

题解1
思路:最大值一定是峰值
LeetCode162. 寻找峰值_第1张图片
代码:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        return max_element(nums.begin(), nums.end()) - nums.begin();
    }
};

知识点:
c++函数 max_element() / min_element()
返回指向范围内具有最大/小值的元素的迭代器[first,last) 什么叫迭代器?

  1. min_element()和max_element【参考】
    作用:返回容器中最小值和最大值。
    max_element(first,end,cmp);其中cmp为可选择参数。

    1. 第三个参数cmp可写可不写, max_element() 和 min_element() 默认是从小到大排列,然后 max_element() 输出最后一个值, min_element() 输出第一个值,但是如果自定义的 cmp 函数写的是从大到小排列,那么会导致 max_element() 和min_element() 的两个结果是对调的
    2. 可以用于 vector 或者 vector 等,也可以用于 int arr[4] 或者string arr[4] ,也可以用于结构体vector或者结构体数组
  2. C++中max()和max_element()的区别【参考】
    max(a,b)返回a和b当中较大的值的迭代器。只能够比价两个数值。
    max_element(a,b)返回[a,b)中最大值的迭代器,能够比较一个区间。一般与begin()和end()函数一起用,注意超尾元素,如果自己手动定义一个区间,要注意尾部是否在范围内。

  3. 具体使用案例

#include 
#include 
 
using namespace std;
#define len 7
 
int main()
{
    int a[7] = {11, 4, 51, 41, 91, 98, 10};
    int min_idx = min_element(a, a+len) - a;
    int max_idx = max_element(a, a+len) - a;
    cout<<min_idx<<" "<<a[min_idx]<<endl;
    cout<<max_idx<<" "<<a[max_idx]<<endl;
    // 我们已经知道返回的是地址,减去数组名是获得下标。同理我们可以直接通过地址获取值
    cout<<*max_element(a,a+7);
     
    return 0;
}

输出结果

1 4
5 98
98

题解2
思路:从左到右遍历,一个位置如果大于左边,那么看是否大于右边,如果满足则为峰值,返回即可,如果 不满足则对下一个位置进行同样的操作,直到到达最后一个位置。

你可能感兴趣的:(LeetCode,算法,leetcode,c++)