Этот пост представляет собой Java-решение для кода Leet проблема 978. В этом упражнении турбулентность определяется как последовательность последовательных строгих возрастаний и понижений.
Для этой задачи мой подход заключался в том, чтобы жадно пройтись по массиву и запомнить текущую турбулентность, а также самую длинную наблюдаемую турбулентность.
В деталях есть несколько крайних случаев, о которых нам нужно позаботиться. Случай двух одинаковых элементов, следующих друг за другом в массиве, отличается от конца турбулентности, где элементы не равны. Например, последовательность 1,2,2,...
содержит турбулентность размера 2 [1,2]
end следующая турбулентность начинается со второго появления элемента 2 (A[2]
) , тогда как 1,2,3,...
содержит турбулентность размера 2 [1,2]
end следующая турбулентность начинается с 2 элементов 2,3
. Другими словами, следующая турбулентность начинается с размера 1 в случае равенства и начинается с размера 2 в случае неравномерности.
Я также задавался вопросом, как лучше всего начать, учитывая, что в массиве гарантирован только один элемент. Затем я выделил моменты, когда текущая турбулентность была размером 1
, потому что в этом случае не было навязанного направления для следующего элемента, требовалось только, чтобы он не был равен предыдущему элементу.
Далее следует полное решение, удачного кодирования :)
class Solution { public int maxTurbulenceSize(int[] A) { int maxTurbulence = 0; int currentTurbulence = 1; boolean goingUp = true; for ( int currentIndex = 1; currentIndex < A.length; currentIndex++) { if (currentTurbulence == 1) { if (A[currentIndex] == A[currentIndex -1]) { // nothing } else { currentTurbulence++; goingUp = (A[currentIndex - 1] < A[currentIndex]); } } else { if (goingUp && (A[currentIndex - 1] > A[currentIndex])) { currentTurbulence++; goingUp = !goingUp; } else if (!goingUp && (A[currentIndex - 1] < A[currentIndex])){ currentTurbulence++; goingUp = !goingUp; } else if (A[currentIndex - 1] == A[currentIndex]){ maxTurbulence = Math.max(maxTurbulence, currentTurbulence); currentTurbulence = 1; goingUp = true; } else { maxTurbulence = Math.max(maxTurbulence, currentTurbulence); currentTurbulence = 2; goingUp = (A[currentIndex - 1] < A[currentIndex]); } } } maxTurbulence = Math.max(maxTurbulence, currentTurbulence); return maxTurbulence; } }