Longest Turbulent Subarray

medium dynamic programming sliding window array

Problem

A subarray is turbulent if the comparison sign flips between every pair of adjacent elements (greater, then less, then greater, …). Given an integer array arr, return the length of the longest turbulent subarray.

Inputarr = [9, 4, 2, 10, 7, 8, 8, 1, 9]
Output5
arr[1..5] = [4, 2, 10, 7, 8] alternates: 4>2<10>7<8, giving length 5.

def max_turbulence_size(arr):
    n = len(arr)
    best = 1
    up = down = 1
    for i in range(1, n):
        if arr[i] > arr[i - 1]:
            up = down + 1
            down = 1
        elif arr[i] < arr[i - 1]:
            down = up + 1
            up = 1
        else:
            up = down = 1
        best = max(best, up, down)
    return best
function maxTurbulenceSize(arr) {
  const n = arr.length;
  let best = 1, up = 1, down = 1;
  for (let i = 1; i < n; i++) {
    if (arr[i] > arr[i - 1]) {
      up = down + 1;
      down = 1;
    } else if (arr[i] < arr[i - 1]) {
      down = up + 1;
      up = 1;
    } else {
      up = 1;
      down = 1;
    }
    best = Math.max(best, up, down);
  }
  return best;
}
class Solution {
    public int maxTurbulenceSize(int[] arr) {
        int n = arr.length;
        int best = 1, up = 1, down = 1;
        for (int i = 1; i < n; i++) {
            if (arr[i] > arr[i - 1]) {
                up = down + 1;
                down = 1;
            } else if (arr[i] < arr[i - 1]) {
                down = up + 1;
                up = 1;
            } else {
                up = 1;
                down = 1;
            }
            best = Math.max(best, Math.max(up, down));
        }
        return best;
    }
}
int maxTurbulenceSize(vector<int>& arr) {
    int n = (int)arr.size();
    int best = 1, up = 1, down = 1;
    for (int i = 1; i < n; i++) {
        if (arr[i] > arr[i - 1]) {
            up = down + 1;
            down = 1;
        } else if (arr[i] < arr[i - 1]) {
            down = up + 1;
            up = 1;
        } else {
            up = 1;
            down = 1;
        }
        best = max(best, max(up, down));
    }
    return best;
}
Time: O(n) Space: O(1)