Longest Mountain in Array
Input: [2,1,4,7,3,2,5]
Output: 5
Explanation: The largest mountain is [1,4,7,3,2] which has length 5.Input: [2,2,2]
Output: 0
Explanation: There is no mountain.0 <= A.length <= 10000
0 <= A[i] <= 10000Input: [2,1,4,7,3,2,5]
Output: 5
Explanation: The largest mountain is [1,4,7,3,2] which has length 5.Input: [2,2,2]
Output: 0
Explanation: There is no mountain.0 <= A.length <= 10000
0 <= A[i] <= 10000class Solution {
public int longestMountain(int[] A) {
int ret = 0;
for (int i = 0; i < A.length; ++i) {
ret = Math.max(ret, getMountainLen(A, i));
}
return ret;
}
private int getMountainLen(int[] nums, int mid) {
// 优化,检查当前点是否是顶点
if (mid == 0 || mid == nums.length - 1 || nums[mid - 1] >= nums[mid] || nums[mid] <= nums[mid + 1]) {
return 0;
}
int leftLen = 0, rightLen = 0;
for (int i = mid - 1; i >= 0; --i) {
if (nums[i] < nums[i + 1]) leftLen++;
else break;
}
if (leftLen == 0) return 0;
for (int i = mid + 1; i < nums.length; ++i) {
if (nums[i] < nums[i - 1]) rightLen++;
else break;
}
if (rightLen == 0) return 0;
return leftLen + rightLen + 1;
}
}class Solution {
public int longestMountain(int[] A) {
int ret = 0, i = 0;
while (i < A.length - 2) {
// 先定位最左边元素
while (i < A.length - 1 && A[i] >= A[i + 1]) {
i++;
}
// 确定左边部分长度
int leftLen = 0;
while (i < A.length - 1 && A[i] < A[i + 1]) {
leftLen++;
i++;
}
// 确定右边部分长度
int rightLen = 0;
while (i < A.length - 1 && A[i] > A[i + 1]) {
rightLen++;
i++;
}
// 检查当前扫描过的部分是否是valid的山峰
if (leftLen > 0 && rightLen > 0) {
ret = Math.max(ret, leftLen + rightLen + 1);
}
}
return ret;
}
}