[数组]寻找峰值

129 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。

思路

  1. 数组为空或者只有一个元素时,返回 0
  2. 判断峰值位于边界的情况,起始或结尾位置元素大于相邻的元素时,返回边界位置
  3. 判断峰值位于数组中间情况

代码实现

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int findPeakElement(vector<int>& nums) {
        // write code here
        int len = nums.size();
        // 只有一个元素或没有元素时,返回 0
        if (len == 0 || len == 1) return 0;
        // 数组起始位置或结尾大于相邻元素时,返回边界位置
        if (nums[0] > nums[1]) return 0;
        if (nums[len - 1] > nums[len - 2]) return len - 1;
        
        int pre = 0;
        int cur = 1;
        int next = 2;
        
        while (next < nums.size())
        {
            // 返回峰值位置
            if (nums[pre] < nums[cur] && nums[next] < nums[cur])
            {
                return cur;
            }
            next++;
            cur++;
            pre++;
        }
        return -1;
    }
};