算法23.0
852. 山脉数组的峰顶索引 - 力扣(LeetCode)
自己的理解:
暴力解法的话 遍历一遍数组 然后存储下峰值元素以及下标就可以了 试试超时没有
哇咔咔 还真的没有超时??? 中等题用遍历数组做出来了?!
下面开始二分算法:
发现mid<left的时候 left=mid也不敢跳出去 万一是结果呢 mid大于ret的时候 right=mid right也不敢跳过啊 万一是结果呢 到底用哪个?
还是要确定好二段性再用二分算法 确定好二段里面每一段分别的性质具体是什么
感觉双指针、滑动窗口都可以啊 只要找到下降的那个趋势 就找到点了 试试滑动窗口
我去还真的过了 比暴力解好一点 时间复杂度超过22%
细节:
maxIndex=(arr[i] > arr[maxIndex]) ? i : maxIndex; 要的就是这句代码
在遍历数组的时候更新:for i循环+三目运算符(本质是一个if语句)
区间最左面和最右面都排除了 所以区间可以从left = 1 right = arr.length-2开始
别人的讲解:
最左面和最右面的元素是不用考虑的 暴力枚举时间复杂是O(n)
当我们这样划分数组之后 就会发现天然的分成了两段 左边的一段满足一个性质 右边的一个段满足一个性质 二段性


下面是题目、效果图和代码:


class Solution
{public int peakIndexInMountainArray(int[] arr) { int maxIndex = 0;for(int i =1;i<arr.length;i++){maxIndex=(arr[i] > arr[maxIndex]) ? i : maxIndex;}return maxIndex;}
}//maxIndex=(arr[i] > arr[maxIndex]) ? i : maxIndex; 要的就是这句代码
//在遍历数组的时候更新:for i循环+三目运算符(本质是一个if语句)

class Solution {public int peakIndexInMountainArray(int[] arr) {//双指针or滑动窗口int left =0 ,right = 1;while(right<arr.length){if(arr[right]<arr[left]) break;left++;right++;}return left;}
}

class Solution
{public int peakIndexInMountainArray(int[] arr) {int left =1 ,right = arr.length-2;while(left<right){int mid=left+(right-left+1)/2;if(arr[mid]>arr[mid-1]) left = mid;else right = mid-1;}return left;}
}
//xiyu251102&1#3*5
