我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:
B.length >= 3
存在 0 < i < B.length - 1 使得 B[0] < B[1] < … B[i-1] < B[i] > B[i+1] > … > B[B.length - 1]
(注意:B 可以是 A 的任意子数组,包括整个数组 A。)
给出一个整数数组 A,返回最长 “山脉” 的长度。
如果不含有 “山脉” 则返回 0。
示例 1:
输入:[2,1,4,7,3,2,5]
输出:5
解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。
示例 2:
输入:[2,2,2]
输出:0
解释:不含 “山脉”。
package leecode;
public class LongestMountain {
/* 输入:[2,1,4,7,3,2,5]
输出:5
解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。*/
//方法1
public int longestMountain(int[] A) {
int res = 0, up = 0, down = 0;
for (int i = 1; i < A.length; ++i) {//[2,1,4,7,3,2,5]
if (down > 0 && A[i - 1] < A[i] || A[i - 1] == A[i])
up = down = 0;
if (A[i - 1] < A[i])
up++;
if (A[i - 1] > A[i])
down++;
if (up > 0 && down > 0 && up + down + 1 > res)
res = up + down + 1;
}
return res;
}
//方法2
public int longestMountain2(int[] A) {
int max=0;
for (int i = 0; i < A.length-1; i++) {
if(A[i]<A[i+1]){
int tempMax=1;
//如果上升,变大1->4->7
while (i<A.length-1 &&A[i]<A[i+1]){
i++;
tempMax++;
}
//如果下降变小7->3->2
while (i<A.length-1 &&A[i]>A[i+1] ){
i++;
tempMax++;
}
//如果退出while循环,即A[i]>A[i+1]不成立,即A[i]<A[i+1],现在又上升2->5,又A[i-1]>A[i],3->2,即3-2-5
if(A[i-1]>A[i])//1-4-7-3-2-5
max=Math.max(max,tempMax);
i--;//
}
}
return max;
}
}