符合下列属性的数组 arr
称为 山脉数组 :
arr.length >= 3
i
(0 < i < arr.length - 1
)使得:
arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
给你由整数组成的山脉数组 arr
,返回满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
的下标 i
。
你必须设计并实现时间复杂度为 O(log(n))
的解决方案。
本题我们可以发现,可以将这个arr数组分为两部分,一部分arr【i】>arr【i-1】,一部分 arr【i】
设一个中间变量mid
- arr【mid】>arr【mid-1】,left=mid
- arr【mid】
- class Solution {
- public:
- int peakIndexInMountainArray(vector<int>& arr) {
- int left=1,right=arr.size()-2;
- while(left
- {
- int mid=left+(right-left+1)/2;
- if(arr[mid]>arr[mid-1])left=mid;
- if(arr[mid]
-1])right=mid-1; - }
- return right;
- }
- };
162. 寻找峰值
题目解析:
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums
,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞
。
你必须实现时间复杂度为 O(log n)
的算法来解决此问题。
解题思路:
本题和上面一题是一样的思路,就是需要注意一下第一个和最后一个位置也可能会是山峰特殊判断一下就好了
- arr【mid】>arr【mid-1】,left=mid
- arr【mid】
解题代码:
- class Solution {
- public:
- int findPeakElement(vector<int>& nums) {
- if(nums.size()==1)return 0;
- if(nums[0]>nums[1])return 0;
- int left=1,right=nums.size()-2;
- if(nums[nums.size()-1]>nums[right])return nums.size()-1;
- while(left
- {
- int mid=left+(right-left+1)/2;
- if(nums[mid]>nums[mid-1]) left=mid;
- if(nums[mid]
-1])right=mid-1; - }
- return left;
- }
- };
-
相关阅读:
Ceph块存储的安装部署和使用
SpringBoot中ElasticsearchRestTemplate的使用示例,(增删改查、高亮查询、id查询、分页查询、时间范围查询、多条件查询)
2022最新!视觉SLAM综述(多传感器/姿态估计/动态环境/视觉里程计)
【计算机视觉 | 目标检测】干货:目标检测常见算法介绍合集(一)
前端知识点、技巧、webpack、性能优化(持续更新~)
网络安全:发起一次CSRF攻击!
关于el-upload看这一篇就够了
Java-基于SSM+JSP的医院挂号管理系统
第20章 Netty
在线pdf请你谨慎打开
-
原文地址:https://blog.csdn.net/m0_69061857/article/details/133487776