852. 山脉数组的峰顶索引
题目描述:
符合下列属性的数组 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<right) { int mid=left+(right-left+1)/2; if(arr[mid]>arr[mid-1])left=mid; if(arr[mid]<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<right) { int mid=left+(right-left+1)/2; if(nums[mid]>nums[mid-1]) left=mid; if(nums[mid]<nums[mid-1])right=mid-1; } return left; } };