最长湍流子数组

image.png

又是一道数组题,而且是”子“数组类的问题,子数组是连续的这一点务必注意。所以这个题又是一个”维护区间“的问题。

维护区间:
即保持一个满足条件的区间
初始化

left=right=0

然后根据问题的条件移动区间左右边界。

区间退出条件是

while r<n

当区间的长度为1的时候,默认满足条件。更新结果

            if end-start==0:
                ans = max(ans,start-end+1)

当区间长度为2的时候,只要两个元素不相等,就满足条件。

            elif end-start==1:
                if A[start]!=A[end]:
                    ans = max(ans,end-start+1)

如果不满足条件,则应该让区间从start下一个位置开始,并且区间长度变为1

                else:
                    start = start+1
                    end = start

当区间长度大于等于2的时候。需要最近的三个元素是之差是否互为相反数,如果满足则移动右边界。如果不是则将区间start改为end-1,区间长度变1

            else:
                if (A[end] - A[end - 1]) * (A[end - 1] - A[end - 2]) < 0:
                    ans = max(ans,end-start+1)
                else:
                    start = end-1
                    end = start

完整代码:

class Solution(object):
    def maxTurbulenceSize(self, A):
        """
        :type A: List[int]
        :rtype: int
        """

        ans,start,end = 0,0,0
        while end<len(A):
            if end-start==0:
                ans = max(ans,start-end+1)
            elif end-start==1:
                if A[start]!=A[end]:
                    ans = max(ans,end-start+1)
                else:
                    start = start+1
                    end = start
            else:
                if (A[end] - A[end - 1]) * (A[end - 1] - A[end - 2]) < 0:
                    ans = max(ans,end-start+1)
                else:
                    start = end-1
                    end = start

            end+=1

        return ans

总结:维护区间的模板写法要熟练,左右边界的更新是个细节,容易出错。


北语张益达
6 声望4 粉丝