Сложность: medium
Дан целочисленный массив arr, верните длину максимального турбулентного подмассива массива arr.
Подмассив считается турбулентным, если знак сравнения меняется между каждой парой смежных элементов в подмассиве.
Более формально, подмассив [arr[i], arr[i + 1], ..., arr[j]] массива arr считается турбулентным тогда и только тогда, когда:
Для всех i <= k < j:
arr[k] > arr[k + 1], когда k нечетное, и
arr[k] < arr[k + 1], когда k четное.
Или, для всех i <= k < j:
arr[k] > arr[k + 1], когда k четное, и
arr[k] < arr[k + 1], когда k нечетное.
Пример:
Input: arr = [9,4,2,10,7,8,8,1,9]
Output: 5
Explanation: arr[1] > arr[2] < arr[3] > arr[4] < arr[5]
👨💻 Алгоритм:
1⃣Сканируйте массив слева направо. Используйте переменные для отслеживания начала текущего блока и максимальной длины турбулентного подмассива.
2⃣Если достигли конца блока (последний элемент или текущий элемент не соответствует условию чередования), зафиксируйте длину этого блока как потенциальный ответ и установите начало нового блока на следующий элемент.
3⃣Повторяйте шаг 2 до конца массива и верните максимальную длину турбулентного подмассива.
😎 Решение:
public class Solution {
public int MaxTurbulenceSize(int[] A) {
int N = A.Length;
int ans = 1;
int anchor = 0;
for (int i = 1; i < N; ++i) {
int c = Math.Sign(A[i - 1] - A[i]);
if (c == 0) {
anchor = i;
} else if (i == N - 1 || c * Math.Sign(A[i] - A[i + 1]) != -1) {
ans = Math.Max(ans, i - anchor + 1);
anchor = i;
}
}
return ans;
}
}Ставь 👍 и забирай 📚 Базу знаний