978. 最长湍流子数组
当 A 的子数组 A[i], A[i+1], …, A[j] 满足下列条件时,我们称其为湍流子数组:
若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];
或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
返回 A 的最大湍流子数组的长度。
解题:
法一:双指针(滑动窗口/滚动数组)
看到子数组肯定先想到双指针啊
依旧是大循环套小循环,只不过判定条件要处理一下
法二:符号数组
先对原数组进行处理,这样转化判定条件的时候方便很多
class Solution:
def maxTurbulenceSize(self, arr: List[int]) -> int:
sign = [] # 符号数组
for i in range(1, len(arr)):
if arr[i-1] < arr[i]:
sign.append(1)
elif arr[i-1] > arr[i]:
sign.append(-1)
else:
sign.append(0)
res = 0
ans = 0
i = 0
while i < len(sign):
if i==0 and sign[0] != 0:
ans += 1
res = max(ans, res)
else:
if sign[i] == 0:
ans = 0
else:
if sign[i]*sign[i-1] == 1 or sign[i-1] == 0:
ans = 1
if sign[i]*sign[i-1] == -1:
ans += 1
res = max(res, ans)
i += 1
return res + 1