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
的最大湍流子数组的长度。
示例 1:
输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])
示例 2:
输入:[4,8,12,16]
输出:2
示例 3:
输入:[100]
输出:1
提示:
1 <= A.length <= 40000
0 <= A[i] <= 10^9
问题分析:
这个题目和我记忆中的拼多多的一个校招题目类似,他们那个是求最长长谷的,一般是一个遍历就可以得到结果。现在介绍一个类似于动态规划的方法。
(1)可以设置三个变量maxAB
,currA
,currB
分别表示,最优值,以当前位置升序时的子串长度,以当前位置降序时的子串长度。
(2)如当前值A[i] > A[i - 1]
,以第i
个元素结尾,呈现升序的情况,此时,currB = currA + 1
且把currB
初始化为1
。A[i] < A[i - 1]
同理即可,如果相等,则currA, currB = 1, 1
。
(3)每遍历一个元素,就判断更新一次最优解maxAB = max(maxAB, currA, currB)
,最后返回结果即可。
Python3实现:
# @Time :2019/01/22
# @Author :LiuYinxing
# 动态规划
class Solution:
def maxTurbulenceSize(self, A):
""" :type A: List[int] :rtype: int """
maxAB, currA, currB = 1, 1, 1 # 初始化
for i in range(1, len(A)):
if A[i] > A[i - 1]: # 以第 i 个元素结尾,呈现升序的情况
currA = currB + 1
currB = 1
elif A[i] < A[i - 1]: # 以第 i 个元素结尾,呈现降序的情况
currB = currA + 1
currA = 1
else:
currA, currB = 1, 1 # 出现相等的情况,重新计数
maxAB = max(maxAB, currA, currB) # 更新最优值
return maxAB
if __name__ == '__main__':
solu = Solution()
A = [9, 4, 2, 10, 7, 8, 8, 1, 9]
print(solu.maxTurbulenceSize(A))
声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。