题目地址:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/
符合下列属性的数组 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 。
示例 1:
输入:arr = [0,1,0]
输出:1
示例 2:
输入:arr = [0,2,1,0]
输出:1
示例 3:
输入:arr = [0,10,5,2]
输出:1
示例 4:
输入:arr = [3,4,5,1]
输出:2
示例 5:
输入:arr = [24,69,100,99,79,78,67,36,26,19]
输出:2
提示:
3 <= arr.length <= 104
0 <= arr[i] <= 106
题目数据保证 arr 是一个山脉数组
进阶: 很容易想到时间复杂度 O(n) 的解决方案,你可以设计一个 O(log(n)) 的解决方案吗?
这道题的题意:给你一个数组,数组length>=3,并且他是一个山峰数组,也就是说有一个下标的元素左边是递增右边是递减,这个元素就是整个数组的最大值,请找出这个元素的下标。进阶log(n)其实就是考虑二分法或者更多的一个提醒。
一、爆破法
我们的爆破法也很简单,直接在二分找到中间的那个数,如果他左边右边都小于他就直接返回,否则,如果他左边小于他,说明右边大于它,那么left指针就只想mountain指针,否则说明左边大于它,那么right指针指向mountain指针
执行结果如下:
34 / 34 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 38.5 MB
public int peakIndexInMountainArrayMe(int[] arr) {
int l = 0,r = arr.length;
int mountain = 0;
while (l<r){
mountain = (l+r) / 2 ;
if(arr[mountain-1] < arr[mountain] && arr[mountain] > arr[mountain+1]) break;
if(arr[mountain-1] < arr[mountain]) l = mountain;
else r = mountain;
}
return mountain;
}
二、评论区大佬:三分法
三分法和二分法类似,只不过分成三等分
执行结果如下:
34 / 34 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 38.7 MB
public int peakIndexInMountainArray(int[] arr) {
int left = 1, right = arr.length - 1;
while (left < right) {
int m = (right - left) / 3;
int m1 = left + m, m2 = right - m;
if (arr[m1] > arr[m2])
right = m2 - 1;
else
left = m1 + 1;
}
return left;
}
总的来说,这道题主题主要是找到最大值,一开始想过先排序,但是排序后很明显就无法返回下标了。
next。