Этот пост представляет собой 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;
  }
}