A mountain must strictly increase then strictly decrease. We can use two pointers to find the start and end of each mountain and track the maximum length.
classSolution {
public:int longestMountain(vector<int>& arr) {
int n = arr.size(), ans =0, i =1;
while (i < n-1) {
if (arr[i-1] < arr[i] && arr[i] > arr[i+1]) {
int l = i, r = i;
while (l >0&& arr[l-1] < arr[l]) l--;
while (r+1< n && arr[r] > arr[r+1]) r++;
ans = max(ans, r-l+1);
i = r;
} else {
i++;
}
}
return ans;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
funclongestMountain(arr []int) int {
n, ans, i:= len(arr), 0, 1fori < n-1 {
ifarr[i-1] < arr[i] &&arr[i] > arr[i+1] {
l, r:=i, iforl > 0&&arr[l-1] < arr[l] { l-- }
forr+1 < n&&arr[r] > arr[r+1] { r++ }
ifr-l+1 > ans { ans = r-l+1 }
i = r } else {
i++ }
}
returnans}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution {
publicintlongestMountain(int[] arr) {
int n = arr.length, ans = 0, i = 1;
while (i < n-1) {
if (arr[i-1]< arr[i]&& arr[i]> arr[i+1]) {
int l = i, r = i;
while (l > 0 && arr[l-1]< arr[l]) l--;
while (r+1 < n && arr[r]> arr[r+1]) r++;
ans = Math.max(ans, r-l+1);
i = r;
} else {
i++;
}
}
return ans;
}
}
classSolution {
funlongestMountain(arr: IntArray): Int {
val n = arr.size
var ans = 0var i = 1while (i < n-1) {
if (arr[i-1] < arr[i] && arr[i] > arr[i+1]) {
var l = i
var r = i
while (l > 0&& arr[l-1] < arr[l]) l--while (r+1 < n && arr[r] > arr[r+1]) r++ ans = maxOf(ans, r-l+1)
i = r
} else {
i++ }
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution:
deflongestMountain(self, arr: list[int]) -> int:
n = len(arr)
ans = i =1 res =0while i < n-1:
if arr[i-1] < arr[i] > arr[i+1]:
l = i
r = i
while l >0and arr[l-1] < arr[l]:
l -=1while r+1< n and arr[r] > arr[r+1]:
r +=1 res = max(res, r-l+1)
i = r
else:
i +=1return res
impl Solution {
pubfnlongest_mountain(arr: Vec<i32>) -> i32 {
let n = arr.len();
letmut ans =0;
letmut i =1;
while i < n-1 {
if arr[i-1] < arr[i] && arr[i] > arr[i+1] {
letmut l = i;
letmut r = i;
while l >0&& arr[l-1] < arr[l] { l -=1; }
while r+1< n && arr[r] > arr[r+1] { r +=1; }
ans = ans.max(r-l+1);
i = r;
} else {
i +=1;
}
}
ans asi32 }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution {
longestMountain(arr: number[]):number {
constn=arr.length;
letans=0, i=1;
while (i<n-1) {
if (arr[i-1] <arr[i] &&arr[i] >arr[i+1]) {
letl=i, r=i;
while (l>0&&arr[l-1] <arr[l]) l--;
while (r+1<n&&arr[r] >arr[r+1]) r++;
ans= Math.max(ans, r-l+1);
i=r;
} else {
i++;
}
}
returnans;
}
}