162. 寻找峰值 - 力扣(LeetCode)

题目描述

峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[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。

说明:
你的解法应该是 O(logN) 时间复杂度的。

题解1

题目要求只需返回其中的任意一个峰值的下标即可。
数组中不存在重复的元素,序列是由多个上升下降序列交替组成。
具体题解见

代码1

/*
没有重复的元素,序列是由上升和下降的序列构成的
时间复杂度为:O(logn)
空间复杂度为:O(1)
*/
class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int len = nums.size();
        int beg = 0, end = len - 1, mid;
        while(beg < end){
            mid = (beg + end) >> 1;
            if(nums[mid] > nums[mid + 1]){//处于大致下降序列,峰值在左侧,可能为mid
                end = mid;
            }
            else{//处于大致上升序列,峰值在右侧,可能为mid+1
                beg = mid + 1;
            }
        }
        return beg;
    }
};

执行结果1

执行结果

发布了152 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/happyeveryday62/article/details/103687795