博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】Find Peak Element ☆
阅读量:5969 次
发布时间:2019-06-19

本文共 1662 字,大约阅读时间需要 5 分钟。

A peak element is an element that is greater than its neighbors.

Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

You may imagine that num[-1] = num[n] = -∞.

For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.

 

思路:

一看这道题,我傻眼了。尼玛这么简单的题居然是中等难度。莫非有阴谋? 然后我写了个线性算法试了一下,结果完美的通过了....

class Solution {public:    int findPeakElement(const vector
&num) { int ans; if(num.size() == 1) //只有一个数字的情况 return 0; for(int i = 0; i < num.size(); i++) { if((i == 0 && num[i] > num[i + 1]) || (i == num.size() - 1 && num[i] > num[i - 1]) || (num[i] > num[i + 1] && num[i] > num[i - 1])) { return i; } } }};

 

然后,我就去讨论圈逛去了,看看到底有什么玄机。一看,果然是有更好的方法。

可以用二分查找,得到O(logN)的算法。

题目中num[i] ≠ num[i+1] 很关键,保证了中间取的值num[mid]与 num[mid + 1]不同,从而相比于num[mid + 1],num[mid]一定位于上坡或下坡。这样不满足峰值条件时,处于上坡就把 l 收缩到mid处,处于下坡就把 r 收缩到 mid 处, 不断收缩,使得最终l与r之间只有一个峰值。

class Solution {public:int findPeakElement(const vector
&num) { int len = num.size(); if (len == 1) return 0; int left = 0, right = len - 1; int mid; while (left < right - 1) { mid = left + (right - left) / 2; if (num[mid] > num[mid-1] && num[mid] > num[mid+1]) return mid; if (num[mid] < num[mid-1]) right = mid; // like hill climbing else left = mid; } return num[left] > num[right] ? left : right; }};

 

转载地址:http://lbwox.baihongyu.com/

你可能感兴趣的文章
Java中如何防止内存泄漏的发生
查看>>
Java中Int转byte分析
查看>>
滑动窗口最大值的golang实现
查看>>
初学Phreeze 3
查看>>
会计的思考(17):还原会计报表的企业个性之一
查看>>
java对象初始化顺序的简单验证
查看>>
[CF452E]Three strings
查看>>
获取指定进程所对应的可执行(EXE)文件全路径(代码)
查看>>
ORA-01722:无效数字
查看>>
搭建golang+vscode开发环境
查看>>
C#占位符
查看>>
java面试-JVM调优和参数配置
查看>>
常用的激活函数
查看>>
【Java学习】网络编程1
查看>>
sqlcmd
查看>>
Excel 已经检测到"XXX.xsl"是SYLK文件,但是不能将其加载的问题
查看>>
(基础篇)PHP获取时间、时间戳的各种格式写法汇总
查看>>
TSM对Oracle数据库备份脚本
查看>>
了解HAProxy原理及参数
查看>>
基于开源技术的上网行为管理实现方案
查看>>