【Leetcode_总结】 978. 最长湍流子数组 - python

Q:

当 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

链接:https://leetcode-cn.com/problems/longest-turbulent-subarray/description/

思路:利用动态规划的思路,设置状态矩阵dp,状态转移是根据所给条件,A[i - 1] > A[i] and A[i - 1] > A[i - 2]) or (A[i - 1] < A[i] and A[i - 1] < A[i - 2]两者之一,dp[i] = dp[i-1]+1,否则判断当前值是否与前值相同,如果不相同,dp[i] = 2,否则 dp[i]就是0

代码:

class Solution(object):
    def maxTurbulenceSize(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        n = len(A)
        if n == 1:
            return 1
        dp = [0 for _ in range(n)]
        dp[0] = 1
        if A[0] == A[1]:
            dp[1] = 1
        else:
            dp[1] = 2
        for i in range(2,n):
            if (A[i - 1] > A[i] and A[i - 1] > A[i - 2]) or (A[i - 1] < A[i] and A[i - 1] < A[i - 2]):
                dp[i] = dp[i-1]+1
            elif A[i - 1] != A[i]:
                dp[i] = 2
        return max(dp)

【Leetcode_总结】 978. 最长湍流子数组 - python_第1张图片

你可能感兴趣的:(Leetcode,数组,动态规划)