Сложность: 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 до конца массива и верните максимальную длину турбулентного подмассива.
😎 Решение:
var maxTurbulenceSize = function(A) {
const N = A.length;
let ans = 1;
let anchor = 0;
for (let i = 1; i < N; ++i) {
const 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;
};Ставь 👍 и забирай 📚 Базу знаний