leetcode-162-寻找峰值

题目描述:

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

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

要完成的函数:

int findPeakElement(vector<int>& nums) 

说明:

1、给定一个vector,里面装着多个int类型的数据,保证相邻的数据不相等。

要求返回vector的峰值,也就是某一个点的数值大于其左边的数值和右边的数值,返回这个点的位置。

vector可能有多个峰值,找到其中一个就可以了。

要求时间复杂度是O(logN)级别的。

2、本来这道题如果没有规定时间复杂度的话,我应该是逐个判断的。

给定限制,反而提供了思路。

以后做这种寻找vector中满足条件的某个数的题目,都可以考虑用二分法降低时间复杂度。

代码如下:(附详解)

    int findPeakElement(vector<int>& nums) 
    {
        int left=0,right=nums.size()-1,mid;
        if(nums.size()==1)return 0;//边界情况,只有一个元素在vector中
        while(left<=right)//当left大于right的时候,结束循环,完全找不到满足条件的元素
        {
            mid=(left+right)/2;
            if(mid==0)//边界情况,如果mid等于0,那么只需判断是不是大于右边,如果不是,那么改变left的值
            {
                if(nums[mid]>nums[mid+1])
                    return mid;
                else
                    left=mid+1;
            }
            else if(mid==nums.size()-1)//同样边界情况
            {
                if(nums[mid]>nums[mid-1])
                    return mid;
                else
                    right=mid-1;
            }
            else//mid在vector的里面(不会在最左边也不会在最右边)
            {
                if(nums[mid]>nums[mid-1]&&nums[mid]>nums[mid+1])//满足条件 
                    return mid;
                else if(nums[mid]<nums[mid-1])//比左边小,那么更改right的值,进行左边这一半的寻找
                    right=mid-1;
                else if(nums[mid]<nums[mid+1])//比右边小,那么更改left的值,进行右边这一半的寻找
                    left=mid+1;
            }
        }
    }

上述代码实测4ms,beats 98.57% of cpp submissions。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蓝天

常见指针定义解读

最近做的C/C++技术面试比较多,发现了一些共同的问题,对于如下所示的指针认识,多数面试者都答错了,作为过来人,这种情况还可以理解的,放在一起确实有些复杂。 ...

5610
来自专栏Python爬虫与算法进阶

学点算法之字符串的乱序检查

问题 字符串的乱序检查。 一个字符串是另一个字符串的乱序。如果第二个字符串只是第一个的重新排列,例如,’heart’ 和 ‘earth’ 就是乱序字符串。’py...

41580
来自专栏小筱月

各种排序算法

冒泡排序还有一种优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序

17730
来自专栏我的技术专栏

图说C++对象模型:对象内存布局详解

43030
来自专栏趣谈编程

希尔排序

21560
来自专栏Python小屋

Python内置函数iter()语法及应用

iter()函数用来返回指定对象的迭代器,有两种用法:iter(iterable)和iter(callable, sentinel),前者要求参数必须为序列或者...

38460
来自专栏斑斓

函数式非凡的抽象能力

如果说面向对象思想是物质世界的哲学观,则函数式思想展现的就是纯粹的数学思维了。函数作为一等公民,它不代表任何物质(对象),而仅仅代表一种转换行为。是的,任何一个...

34950
来自专栏云霄雨霁

排序----希尔排序

16800
来自专栏算法channel

Python:lambda表达式的两种应用场景

python书写简单,功能强大, 迅速发展成为 AI ,深度学习的主要语言。介绍Python中的lambda表达式,注意到,它只是一个表达式,不是语句啊。

14510
来自专栏人工智能LeadAI

讨厌算法的程序员 | 第六章 归并排序

分而治之 从算法设计的分类上来说,插入排序属于增量方法。在排序好子数组A[1 ‥ j-1]后,再将单个元素A[j]插入子数组的适当位置,产生排序好的子数组A[1...

38560

扫码关注云+社区

领取腾讯云代金券