LeetCode OJ 162. Find Peak Element
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.
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的更多相关文章
- 【LeetCode】162. Find Peak Element 解题报告(Python)
[LeetCode]162. Find Peak Element 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/ ...
- 【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 ...
- LeetCode OJ:Find Peak Element(寻找峰值元素)
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- 【刷题-LeetCode】162 Find Peak Element
Find Peak Element A peak element is an element that is greater than its neighbors. Given an input ar ...
- leetcode 日记 162. Find Peak Element java python
根据题目可知,输入为:一个相邻元素不相等的数列,输出为:其中一个(上)峰值的序号.并且要求时间复杂度为logn 分析:由于题目要求时间复杂度为logn,因此不能进行全部遍历.又因为只需要找到其中的一个 ...
- LeetCode 162. Find Peak Element (找到峰值)
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- (二分查找 拓展) 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 ...
- [LeetCode] 162. Find Peak Element 查找峰值元素
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- LeetCode 162 Find Peak Element
Problem: A peak element is an element that is greater than its neighbors. Given an input array where ...
随机推荐
- Linux的一些简单命令(三)
1.解压缩算法:使用gzip算法进行解压缩, 压缩语法:gzip filename 解压语法:gzip -dv filename 2.解压缩算法:使用bzip2算法进行解压缩, 压缩语法:bz ...
- tcp异常终止连接
服务端: #include <sys/socket.h> #include <unistd.h> #include <sys/types.h> #include & ...
- 整理一些css在使用中的小技巧(进行中)
1. 消除li排列display:inline-block的间隙 ul{ font-size:; } ul li{ display:inline-block; }
- SpringMVC同时使用<mvc:resources … />和日期转换Formatter时出现问题的解决方法
很久没更新博文了,不是没有学习,而是很多东西记在OneNote里面,收获很多啊,因为各种杂事,所以对于博客很久没更新了. 个人觉得:博客比起OneNote或者为知笔记之类的云笔不同在于博客应该记载的是 ...
- WinForm 布局,容器、打印和对话框控件
今天,我主要学习了容器控件.打印控件.对话框控件. 在正式进行今天的内容之前,首先补充了布局的两个属性:Anchor:锁定位置,Dock:填充位置,一般与容器控件配合使用. 之后,我学习了第一部分内容 ...
- 关于oracle数据库(11)
事务 事务是最小的工作单元,是对数据库的若干操作,增删查改(要不就都成功,要不就都失败) 在oracle数据库中,事务是默认打开的,其他数据库都需要一条语句来打开事务,默认关闭的 事务的特征 原子性. ...
- 多标记学习--Learning from Multi-Label Data
传统分类问题,即多类分类问题是,假设每个示例仅具有单个标记,且所有样本的标签类别数|L|大于1,然而,在很多现实世界的应用中,往往存在单个示例同时具有多重标记的情况. 而在多分类问题中,每个样本所含标 ...
- 转 错误:ORA-28002: the password will expire within 7 days 解决方法
今天在使用sqlplus时出现 =============================================== ERROR:ORA-28002: the password will e ...
- Nginx下$_POST获取不到数据的解决方法
运行环境:windows+phpstorm+Nginx 步骤1:找到php.ini 配置文件,查找enable_post_data_reading变量,把Off改为On,确保其打开状态: 步骤2:将p ...
- git clone出现SSL错误
在学习git的时候,发现不能使用git clone从github.com下载,报了个ssl错误. Cloning into cancan... error: SSL certificate probl ...