#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return int整型
#
class Solution:
    def longestmountain(self, nums):
        data = nums
        # data = self.del_repetition(data)  # 删除平原(高度一样的区域)
        n = len(data)
        if n < 3:  # 山脉长度>=3
            return 0
        elif (data == sorted(data)) or (data == sorted(data, reverse=True)):  # 全为上坡/下坡
            return 0

        l = r = a = b = 0  # l,r为当前山脉的左右边界索引;a,b为最长山脉的左右边界索引
        mountain_list = []  # 各个大小山脉
        while r < n - 1:  # 找到所有山峰/山坡的左右边界索引
            max_height_tmp = data[l]
            flag_up = True  # 山峰是否在走上坡路
            for i in range(l + 1, n):  # 找到当前山峰/山坡的左右边界索引
                # print(data[i])
                if data[i] > data[i - 1]:
                    if flag_up:  # 山峰在走上坡路
                        max_height_tmp = data[i]  # 当前为止的最高高度
                        r = i
                        if i == n - 1:
                            break
                        continue
                    else:  # 山脉结束,进入下一个山脉(下坡过程中比上一位置高)
                        a, b = self.get_ab(data, l, i - 1, a, b, mountain_list)
                        l = r = i - 1
                        break
                elif data[i] == data[i - 1]:  # 平原区域
                    if i > l + 1:  # 不是刚起步的地方
                        a, b = self.get_ab(data, l, i - 1, a, b, mountain_list)
                    l = r = i
                    break
                if data[i] < max_height_tmp:  # 山峰开始走下坡路
                    flag_up = False
                    r = i
                    if i == n - 1:
                        break
                    continue
        a, b = self.get_ab(data, l, i, a, b, mountain_list)
        # return b-a+1  # 有可能只有低谷没有山峰,该结果错误

        mountain_list = sorted(mountain_list, key=len, reverse=True)  # 按照长度对山脉进行排序,长度最长的在前面
        for mou in mountain_list:
            if (mou != sorted(mou)) and (mou != sorted(mou, reverse=True)):  # 不是纯上坡/下坡,存在山峰(即为山脉)
                return len(mou)
        return 0  # 只有低谷



    def get_ab(self, data, l, r, a, b, mountain_list=None):
        # print(data[l : r + 1])  # 输出山脉的各区域高度
        if (r - l) > (b - a):  # 更新山脉最长距离
            a, b = l, r
        if mountain_list is not None:
            mountain_list.append(data[l : r + 1])
        return a, b

    def del_repetition(self, data):  # 删除平原区域;若连续多个数值相等,则删除重复数值(如112221,变为121)
        new_data = []
        for i in range(len(data)):
            if i == 0 or data[i] != data[i - 1]:
                new_data.append(data[i])
        # print(new_data)
        # self.plot_process_mountains(data, new_data, data_str='Full Mountain', new_data_str='Tidy Mountain')
        return new_data

    # def draw_mountain(self, data_list, ax, plt_str=""):
    #     ax.plot(data_list, marker="o", linestyle="-")
    #     ax.set_title(plt_str)
    #     ax.grid(True)

    # def plot_process_mountains(self, data, new_data, data_str="", new_data_str=""):
    #     fig, (ax1, ax2) = plt.subplots(2, 1)
    #     self.draw_mountain(data, ax1, plt_str=data_str)
    #     self.draw_mountain(new_data, ax2, plt_str=new_data_str)
    #     plt.tight_layout()
    #     plt.show()