LeetCode:978. Longest Turbulent Subarray - Python

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)可以设置三个变量maxABcurrAcurrB分别表示,最优值,以当前位置升序时的子串长度,以当前位置降序时的子串长度。

(2)如当前值A[i] > A[i - 1],以第i个元素结尾,呈现升序的情况,此时,currB = currA + 1且把currB 初始化为1A[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))

声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。

题目链接参考链接

点赞