
符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3i(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;
- }
- };

-
相关阅读:
Go的并发的退出
前端三剑客:一文入门HTML
Android:实现手机前后摄像头预览同开
Metabase学习教程:入门-2
CodeWhisperer 的使用心得
day-37 最大正方形
Vue学习笔记四
Docker安装Hadoop
前端工程师面试题库
【uml期末复习】统一建模语言大纲
-
原文地址:https://blog.csdn.net/m0_69061857/article/details/133487776