You are given an integer array arr, return the length of a maximum size turbulent subarray of arr.
A subarray is turbulent if the comparison sign flips between each adjacent pair of elements in the subarray.
More formally, a subarray [arr[i], arr[i + 1], ..., arr[j]] of arr is said to be turbulent if and only if:
For i <= k < j:
arr[k] > arr[k + 1] when k is odd, andarr[k] < arr[k + 1] when k is even.Or, for i <= k < j:
arr[k] > arr[k + 1] when k is even, andarr[k] < arr[k + 1] when k is odd.Example 1:
Input: arr = [2,4,3,2,2,5,1,4]
Output: 4Explanation: The longest turbulent subarray is [2,5,1,4].
Example 2:
Input: arr = [1,1,2]
Output: 2Constraints:
1 <= arr.length <= 40,0000 <= arr[i] <= 1,000,000,000class Solution:
def maxTurbulenceSize(self, arr: List[int]) -> int:
n = len(arr)
res = 1
for i in range(n - 1):
if arr[i] == arr[i + 1]:
continue
sign = 1 if arr[i] > arr[i + 1] else 0
j = i + 1
while j < n - 1:
if arr[j] == arr[j + 1]:
break
curSign = 1 if arr[j] > arr[j + 1] else 0
if sign == curSign:
break
sign = curSign
j += 1
res = max(res, j - i + 1)
return resclass Solution:
def maxTurbulenceSize(self, arr: List[int]) -> int:
n = len(arr)
memo = {}
def dfs(i, sign):
if i == n - 1:
return 1
if (i, sign) in memo:
return memo[(i, sign)]
res = 1
if ((sign and arr[i] > arr[i + 1]) or
(not sign and arr[i] < arr[i + 1])
):
res = 1 + dfs(i + 1, not sign)
memo[(i, sign)] = res
return res
max_len = 1
for i in range(n):
max_len = max(max_len, dfs(i, True), dfs(i, False))
return max_lenclass Solution:
def maxTurbulenceSize(self, arr: List[int]) -> int:
n = len(arr)
if n == 1:
return 1
dp = [[1] * 2 for _ in range(n)]
max_len = 1
for i in range(1, n):
if arr[i] > arr[i - 1]:
dp[i][1] = dp[i - 1][0] + 1
elif arr[i] < arr[i - 1]:
dp[i][0] = dp[i - 1][1] + 1
max_len = max(max_len, dp[i][0], dp[i][1])
return max_lenclass Solution:
def maxTurbulenceSize(self, arr: List[int]) -> int:
l, r, res, prev = 0, 1, 1, ""
while r < len(arr):
if arr[r - 1] > arr[r] and prev != ">":
res = max(res, r - l + 1)
r += 1
prev = ">"
elif arr[r - 1] < arr[r] and prev != "<":
res = max(res, r - l + 1)
r += 1
prev = "<"
else:
r = r + 1 if arr[r] == arr[r - 1] else r
l = r - 1
prev = ""
return resclass Solution:
def maxTurbulenceSize(self, arr: List[int]) -> int:
n = len(arr)
res = cnt = 0
sign = -1
for i in range(n - 1):
if arr[i] > arr[i + 1]:
cnt = cnt + 1 if sign == 0 else 1
sign = 1
elif arr[i] < arr[i + 1]:
cnt = cnt + 1 if sign == 1 else 1
sign = 0
else:
cnt = 0
sign = -1
res = max(res, cnt)
return res + 1