Вы можете вспомнить, что массив arr является горным массивом тогда и только тогда, когда:
длина массива arr >= 3
Существует индекс i (счёт начинается с 0) такой, что:
arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
Дан целочисленный массив arr, верните длину самой длинной подпоследовательности, которая является горной. Верните 0, если такой подпоследовательности нет.
Пример:
Input: arr = [2,1,4,7,3,2,5]
Output: 5
Explanation: The largest mountain is [1,4,7,3,2] which has length 5.
C# решение
сопоставлено/оригиналpublic class Solution {
public int LongestMountain(int[] arr) {
int n = arr.Length;
int ans = 0;
int baseIndex = 0;
while (baseIndex < n) {
int end = baseIndex;
if (end + 1 < n && arr[end] < arr[end + 1]) {
while (end + 1 < n && arr[end] < arr[end + 1]) {
end++;
}
if (end + 1 < n && arr[end] > arr[end + 1]) {
while (end + 1 < n && arr[end] > arr[end + 1]) {
end++;
}
ans = Math.Max(ans, end - baseIndex + 1);
}
}
baseIndex = Math.Max(end, baseIndex + 1);
}
return ans;
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int LongestMountain(vector<int>& arr) {
int n = arr.size();
int ans = 0;
int baseIndex = 0;
while (baseIndex < n) {
int end = baseIndex;
if (end + 1 < n && arr[end] < arr[end + 1]) {
while (end + 1 < n && arr[end] < arr[end + 1]) {
end++;
}
if (end + 1 < n && arr[end] > arr[end + 1]) {
while (end + 1 < n && arr[end] > arr[end + 1]) {
end++;
}
ans = max(ans, end - baseIndex + 1);
}
}
baseIndex = max(end, baseIndex + 1);
}
return ans;
}
}
Java решение
сопоставлено/оригиналclass Solution {
public int longestMountain(int[] A) {
int N = A.length;
int ans = 0, base = 0;
while (base < N) {
int end = base;
if (end + 1 < N && A[end] < A[end + 1]) {
while (end + 1 < N && A[end] < A[end + 1]) end++;
if (end + 1 < N && A[end] > A[end + 1]) {
while (end + 1 < N && A[end] > A[end + 1]) end++;
ans = Math.max(ans, end - base + 1);
}
}
base = Math.max(end, base + 1);
}
return ans;
}
}
Python решение
сопоставлено/оригиналclass Solution:
def longestMountain(self, arr: List[int]) -> int:
n = len(arr)
ans = 0
base = 0
while base < n:
end = base
if end + 1 < n and arr[end] < arr[end + 1]:
while end + 1 < n and arr[end] < arr[end + 1]:
end += 1
if end + 1 < n and arr[end] > arr[end + 1]:
while end + 1 < n and arr[end] > arr[end + 1]:
end += 1
ans = max(ans, end - base + 1)
base = max(end, base + 1)
return ans
Go решение
сопоставлено/оригиналfunc longestMountain(arr []int) int {
n := len(arr)
ans := 0
base := 0
for base < n {
end := base
if end+1 < n && arr[end] < arr[end+1] {
for end+1 < n && arr[end] < arr[end+1] {
end++
}
if end+1 < n && arr[end] > arr[end+1] {
for end+1 < n && arr[end] > arr[end+1] {
end++
}
ans = max(ans, end-base+1)
}
}
base = max(end, base+1)
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
Algorithm
Инициализируйте переменные для отслеживания текущего основания и максимальной длины горного массива.
Для каждого индекса, который может быть началом горного массива, определите пиковый элемент и найдите правую границу горного массива.
Если найден горный массив, обновите максимальную длину и переместите основание на конец текущего горного массива.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.