手机网站主页设计,俄罗斯局势最新消息,wordpress图片链接原图,电子商务+网站建设LC50天成就了
题型#xff1a;数组、滑动窗口、二分
链接#xff1a;162. 寻找峰值 - 力扣#xff08;LeetCode#xff09;
来源#xff1a;LeetCode
题目描述
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums#xff0c;找到峰值元素并返回其索…LC50天成就了
题型数组、滑动窗口、二分
链接162. 寻找峰值 - 力扣LeetCode
来源LeetCode
题目描述
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums找到峰值元素并返回其索引。数组可能包含多个峰值在这种情况下返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] nums[n] -∞ 。
你必须实现时间复杂度为 O(log 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。提示
1 nums.length 1000-231 nums[i] 231 - 1对于所有有效的 i 都有 nums[i] ! nums[i
题目思路
滑动窗口就是一次遍历三个元素单时间复杂度O(N),不满足条件
O(logN)的时间复杂度基本是点名用二分难点在于如何理解二分 根据题意不难看出如果数组元素严格递增/递减的话峰值就是末尾/开头 如果是先增后减那很明显这个【极值点】就是峰值 如果是先减后增那么两个【边界】都是峰值
那二分的思路就是从看【mid】和【mid1】来确定递增递减①如果递增——即是【mid】【mid1】看就以【mid1】为左边界②如果递减——即是【mid】【mid 1】那就以【mid】为有边界 最终left和right相遇是就找到了极值点
C代码
class Solution {
public:int findPeakElement(vectorint nums) {// 二分int len nums.size();if(len 1)return 0;int left -1;int right len -1;while(left 1 right){int mid (left right) / 2;if(nums[mid] nums[mid 1])//如果是一种递增的趋势right mid;//遍历mid的左边看看有没有递减的趋势else//如果是递减的趋势left mid;}return right;}
};
结算页面