算法思想一:遍历+峰值对比
解题思路:
1、找到索引最大的那个山峰元素并返回其索引,考虑从后往前遍历
2、假设 ,需要对端点做处理
即:在对于数组的最后一个值,只需要考虑是否大于等于前面一个值,代码如(&&),对于数组的第一个值,只需要考虑是否大于后面一个值,代码如(&&),对于其他情况,判断某一个值是否大于等于左右两个值,代码如&&
代码展示:
JAVA版本
import java.util.*; public class Solution { /** * 寻找最后的山峰 * @param a int整型一维数组 * @return int整型 */ public int solve (int[] a) { // write code here int n = a.length-1; // 倒序遍历 for(int i=n;i>=0;i--){ // 索引为 0 n的特殊情况 if((i==n&&a[i]>=a[i-1])||(i==0&&a[i]>=a[i+1])){ return i; // 其他区域峰值 }else if(a[i-1]>=a[i]&&a[i-1]>=a[i-2]){ return i-1; } } return -1; } }
复杂度分析
时间复杂度:表示数组的长度,遍历一遍数组时间
空间复杂度:仅使用一个常数级变量空间
算法思想二:方法一优化
解题思路:
方法一中除边界外,其余值均比较了两次,忽略了一个性质,即若从右往左遍历,当下标index处的值不是峰值时,其必满足,所以当检测index-1处是否为峰值时只需要与左边的值进行比较。
图解:
*
*
代码展示:
Python版本
class Solution: def solve(self , a ): # write code here # 倒序遍历 for i in range(len(a)-1, -1, -1): # a[i] > a[i-1] 即为最大索引峰值 if a[i] > a[i-1]: return i # 如果没有则返回数组最后位的索引 return len(a)-1
复杂度分析
时间复杂度:N表示数组的长度,遍历一遍数组时间
空间复杂度:仅使用常数级变量空间