LeetCode——162. Find Peak Element
一.题目链接:
https://leetcode.com/problems/find-peak-element/
二.题目大意:
  给定一个长度为N的一维数组,数组是无序的,要求找到数组中的极大值(或局部最大值),并返回该极大值的下标,并假设 nums[-1] = nums[n] = -∞.;当某元素同时大于它两边的元素时,则该元素是数组中的一个极大值,数组中若存在多个极大值,则返回任意一个即可。
算法的时间复杂度要求为log级别。
三.题解:
这个问题的最直观的解法,就是遍历一遍数组,然后判断每个元素是否符合极大值的条件,但是时间复杂度为O(N),不符合题目的要求。既然要求是对数级别的时间复杂度,那就不妨利用二分法的思想来查找符合条件的元素。
代码如下:
class Solution
{
public:
int findPeakElement(vector<int>& nums)
{
if(nums.empty())
return -1;
int len = nums.size();
int low = 0;
int high = len - 1;
while(low < high - 1)//至少要省出一个中间值来,所以low < high -1
{
int mid = ((high - low) >> 1) + low;//一位运算符的优先级比较低,所以一定加上括号
if(nums[mid] > nums[mid + 1] && nums[mid] > nums[mid - 1])
return mid;
else if(nums[mid] < nums[mid + 1])
{
if (low == mid)//特殊情况,必须通过low = mid + 1跳出这种循环
low = mid + 1;
else
low = mid;
} else
high = mid;
}
return nums[low] > nums[high] ? low : high;//有可能还没找到mid就跳出循环了,此时low和high必有一个满足条件 }
};
该算法的时间复杂度为O(logN),空间复杂度为O(1),能够满足题目的要求。有几点需要注意:
1.循环的终止条件为low < high -1,因为极大值要同时大于两边的元素,所以至少要有三个值,否则就跳出循环。
2.有种特殊情况,就是low = mid后,再次更新mid的话,low与mid的值还是相同,相当于陷入了死循环,此时通过low = mid + 1跳出死循环。
3.如果在循环中没有返回mid的话,可能数组只有一个元素,也可能只有数组的末尾元素才是极大值,所以最后要判断一下low和high的值,并返回其中较大的。
四.题目扩展:
如果数组为二维数组的话,如何找到局部最大值(极大值)?
一般有三种方法:直接遍历、利用二分法、利用画圈法(分治)。具体可以参考:https://www.jianshu.com/p/b4f5cb071f04 或者https://blog.csdn.net/m0_37747541/article/details/79629457
LeetCode——162. Find Peak Element的更多相关文章
- 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 ...
 - Java for 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  --------- java
		
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
 - 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(M)(P)
		
题目: A peak element is an element that is greater than its neighbors. Given an input array where num[ ...
 - 【LeetCode】162. Find Peak Element 解题报告(Python)
		
[LeetCode]162. Find Peak Element 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/ ...
 
随机推荐
- IOS 极光推送自定义通知遇到的一些坑
			
主要方法: //自定义推送 - (void)networkDidReceiveMessage:(NSNotification *)notification { NSDictionary * userI ...
 - TabLayout下划线指示器自适应文字宽度
			
解决方案1: 更新design库到28.0.0-rc01 implementation 'com.android.support:design:28.0.0-rc01' 然后在TabLayout里设置 ...
 - day14 生成器迭代器
			
迭代器(iterator) 可迭代对象: 可以使用迭代器取出数据的对象 判断一个对象是否是可迭代对象,就看这个对象有没有实现__iter__方法 所有的容器类型(包括字符串)都是可迭代的 迭代器的使用 ...
 - IDEA创建简单SpringBoot项目
			
环境:jdk 1.打开IDEA -->New --> Project -->Spring Initalizer-->next 2.此处,只做创建示例,所以next后Group等 ...
 - Python SyntaxError: invalid token
			
python命名不能以数字开头,import时会报错
 - 理解JavaScript中的属性描述符
			
我们把描述JavaScript中定义内部特性的属性叫做属性描述符 分为两大类:数据描述符和存取描述符 数据描述符是一个拥有可写或不可写的属性(Writable); 存取描述符不包含数据值,是一组拥有g ...
 - mac pkg移除
			
1打开终端 sudo bash < <(curl -sL https://raw.github.com/mpapis/pkg_uninstaller/master/pkg-install) ...
 - go接口
			
// 接口例子package main import "fmt" type Human struct { Name string Age int Sex string Phone ...
 - 渗透测试学习 九、 MSsql注入上
			
MSsql注入漏洞详解 (Asp.Aspx站,常见于棋牌网站.考试网站.大学网站.政府网站.游戏网站.OA办公系统) 大纲:msSQL数据库调用分析 msSQL注入原理 msSQL注入另类玩法 msS ...
 - 数据库关闭,shutdown三种语句。
			
1.shutdown normal 正常方式关闭数据库. 2.shutdown immediate 立即方式关闭数据库. 在SVRMGRL中执行shutdown immedia ...