# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @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()