LeeCode题目笔记

2019-12-04 寻找峰值

2019-12-09  本文已影响0人  Antrn

峰值元素是指其值大于左右相邻值的元素。

给定一个输入数组 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) 时间复杂度的。

C++1

二分查找法。
首先,判断当数组的长度为0的时候,直接返回-1
其次,当数组长度为1的时候,直接返回0就好了。
然后,使用二分法计算峰值的位置,从示例中可以看出,峰值是大于左右两边的值的,那么就以此作为判定条件,当计算中间下标的值小于右边值的时候,那么我们把此时的mid+1的下标作为下次迭代的左下标,右下标不变;当中间值大于等于右边值的时候,我们把此中间下标mid赋值为下次迭代的右下标,直到left==right为止,跳出循环。

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        long mid = 0, left = 0, right = nums.size()-1;
        if(right == -1){
            return -1;
        }
        if(right == 0){
            return 0;
        }
        while(left < right){
            mid = (left+right)/2; // 向下取整
            if(nums[mid]<nums[mid+1]){
                left = mid + 1;
            }else{
                right = mid;
            }
        }
        return left;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读