我们把符合下列属性的数组 A 称作山脉:
A.length >= 3
存在 0 < i < A.length - 1
使得 A[0] < A[1] < … A[i-1] < A[i] > A[i+1] > … > A[A.length - 1]给定一个确定为山脉的数组,
返回任何满足 A[0] < A[1] < … A[i-1] < A[i] > A[i+1] > … > A[A.length - 1] 的 i 的值。
示例 1:
输入:[0,1,0]
输出:1
示例 2:
输入:[0,2,1,0]
输出:1
提示:
3 <= A.length <= 10000
0 <= A[i] <= 10^6
A 是如上定义的山脉
解法一:
这道题目一开始并没有看懂 -
然后尝试了一下是不是求最大的数索引,然后,就通过了^
步骤如下1找出最大的值,Math.max.apply(Function, Args)
2找出位置,indexOf(string,[fromindex])
var peakIndexInMountainArray = function(A) {
var x=Math.max.apply(null,A)
return A.indexOf(x)
};
32 / 32 个通过测试用例
执行用时:68 ms
解法二:
使用遍历加判断,保留遍历过程中最大那个数,和对应的索引位置。最后返回索引
另外山峰数组是有序的,从低到高再从高到低,所以当遍历的过程中,数值在往下走时就已经可以跳出循环了。
var peakIndexInMountainArray = function(A) {
var max=0,pos=0
for(i in A){
i=parseInt(i)
if(A[i]>max){
max=A[i]
pos=i
}
}
return pos;
};
32 / 32 个通过测试用例
执行用时:84 ms
解法三:
也可以从中间开始循环,当左边更大时索引-1,当右边更大那么索引+1
var peakIndexInMountainArray = function(A) {
var max=Math.max.apply(null,A)
var len=A.length-1,center=Math.ceil(len/2);
for(var i=center;i<=len;){
if(A[i]==max){
max=i;break;
}
if(A[i]>A[i+1] || A[i-1]>A[i]){
i--
}else if(A[i]<A[i+1] || A[i-1]<a[i]){
i++
}
}
return max;
}
32 / 32 个通过测试用例
执行用时:80 ms