算法思想一:遍历+峰值对比
解题思路:
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表示数组的长度,遍历一遍数组时间
空间复杂度:仅使用常数级变量空间



京公网安备 11010502036488号