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.

click to show spoilers.

Credits:
Special thanks to @ts for adding this problem and creating all test cases.


【题目分析】

在一个数组中任意两个相邻元素是不相同的,找到这样的元素,它比它的邻居节点都要大。如果存在这样的元素,返回其中任意一个即可。


【解体思路】

方法1:

遍历数组,

  • 如果是最左边的元素,并且它比右邻居大,那它就是peak elmemnt。
  • 如果是最右边的元素,并且它比左邻居大,也是peak element。
  • 否则,如果它比左右邻居都大,那么它也是peak element。

代码如下:

 class Solution
{
public:
int findPeakElement(vector<int>& nums)
{
if (nums.size() == 1)
{
return 0;
} for (int i = 0; i < nums.size(); i++)
{
if ((i == 0 && nums[i] > nums[i + 1])
|| (i == nums.size() - 1 && nums[i] > nums[i - 1]))
{
return i;
} if (0 < i && i < nums.size() - 1
&& nums[i] > nums[i - 1] && nums[i] > nums[i + 1])
{
return i;
}
} return -1;
}
};

方法2:

上面的算法用到了很多次比较,下面给出一段更简单的代码:

 class Solution
{
public:
int findPeakElement(vector<int>& nums)
{
// 对于nums[0]:题目规定它大于左邻居(不存在),因此只要它比右邻居大,那它就是peak element。
// 如果不是,那说明它不比右邻居大。而题目规定相邻节点不相等,因此它必然小于右邻居。
//
// 对于nums[1]:由上面的分析可知:左邻居小于当前节点。因此只要它比右邻居大,那就是peak element了。
// 如果也不是,那说明它也比右邻居小。
// ...
// 对于nums[sz - 2]:如果之前都没有返回。由上面规律可知:它比左邻居大。
// 而按照题目规定,它又一定大于右邻居(不存在)。因此它一定是peak element。
for (int i = 0; i < nums.size() - 1; i++)
{
if (nums[i] > nums[i + 1])
{
return i;
}
}
return nums.size() - 1;
}
};

上面两个解法都能够被LeetCode接受,但是它们的时间复杂度都是是O(n)。而题目中要求是:O(log n)


方法3:

由上面的分析,我们可以得出这样一个规律:

只要数组满足下面的形式:

[ 小,大,... 未知 ...,大,小 ]

那么其中一定能找到peak elememnt。

尝试用二分法处理:

取数组的中间值mid

  • 如果mid的值比mid+1的值小

    那么从mid开始的数组右半部分将满足:[小,大,...,大,小]的形式,所以其中一定有peak element。

    又因为mid肯定不是peak element,所以可以进一步把范围缩小为[mid+1, 数组末尾]

  • 如果mid的值比mid+1的值大

    那么从数组的开始位置mid+1位置,也将构成[小,大,...,大,小]的形式。

    mid+1显然也不是peak element。所以可进一步把范围缩小到[数组开始,mid]

代码如下:

 public class Solution {
public int findPeakElement(int[] nums) {
int left = 0, right = nums.length-1;
while(left < right){
int mid = (right - left)/2 + left;
if(nums[mid] > nums[mid+1])
right = mid;
else
left = mid + 1;
}
return left;
}
}

LeetCode OJ 162. Find Peak Element的更多相关文章

  1. 【LeetCode】162. Find Peak Element 解题报告(Python)

    [LeetCode]162. Find Peak Element 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/ ...

  2. 【LeetCode】162. Find Peak Element (3 solutions)

    Find Peak Element A peak element is an element that is greater than its neighbors. Given an input ar ...

  3. LeetCode OJ:Find Peak Element(寻找峰值元素)

    A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...

  4. 【刷题-LeetCode】162 Find Peak Element

    Find Peak Element A peak element is an element that is greater than its neighbors. Given an input ar ...

  5. leetcode 日记 162. Find Peak Element java python

    根据题目可知,输入为:一个相邻元素不相等的数列,输出为:其中一个(上)峰值的序号.并且要求时间复杂度为logn 分析:由于题目要求时间复杂度为logn,因此不能进行全部遍历.又因为只需要找到其中的一个 ...

  6. LeetCode 162. Find Peak Element (找到峰值)

    A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...

  7. (二分查找 拓展) leetcode 162. Find Peak Element && lintcode 75. Find Peak Element

    A peak element is an element that is greater than its neighbors. Given an input array nums, where nu ...

  8. [LeetCode] 162. Find Peak Element 查找峰值元素

    A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...

  9. LeetCode 162 Find Peak Element

    Problem: A peak element is an element that is greater than its neighbors. Given an input array where ...

随机推荐

  1. Unity 发布到IOS,Android的各种坑

    Unity 发布到IOS的注意事项1.开发环境MAC环境:Xcode环境 7.2.1Unity环境:Unity5.32.基本说明首先,我说一下,这是我在对Unity发布到IOS的实际使用中,总结出来的 ...

  2. linux shell脚本学习xargs命令使用详解

    作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题 xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处 ...

  3. magento里的session传值

    1.$registrationCode = Mage::getSingleton('customer/session' )->setData('login_phone_code', $valid ...

  4. mysql 中文字段排序( UTF8按拼音首字母排序)

    select * from tableName CONVERT( FieldName USING gbk ) COLLATE gbk_chinese_ci desc

  5. [ An Ac a Day ^_^ ] [kuangbin带你飞]专题五 并查集 POJ 2236 Wireless Network

    题意: 一次地震震坏了所有网点 现在开始修复它们 有N个点 距离为d的网点可以进行通信 O p   代表p点已经修复 S p q 代表询问p q之间是否能够通信 思路: 基础并查集 每次修复一个点重新 ...

  6. typeof做类型判断时容易犯下的错

    学过js同学都知道js的数据类型有 字符串.数字.布尔.Null.Undefined和object(数组.function......) 作为一个初学者我一直认为每个数据类型返回的结果是这样的 typ ...

  7. Openjudge-NOI题库-Pell数列

    题目描述 Description Pell数列a1, a2, a3, ...的定义是这样的,a1 = 1, a2 = 2, ... , an = 2 * an − 1 + an - 2 (n > ...

  8. Super Jumping! Jumping! Jumping!杭电1087

    Description Problem Description Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumpi ...

  9. Zsh安装

    Zsh 使用 Homebrew 完成 zsh 和 zsh completions 的安装 brew install zsh zsh-completions 安装 oh-my-zsh 让 zsh 获得拓 ...

  10. kindeditor编辑器上传图片失败 错误 405.0解决办法(亲测)

    HTTP 错误 405.0 - Method Not Allowed(省略)editor/php/upload_json.php?dir=image物理路径 http://www.gdgoga.com ...