Leetcode 每日一题
题目链接: 845. 数组中的最长山脉
解题思路: DP求出输入数组的正序的最长上升序列数组和逆序最长上升数组(最长下降)。对于相同位置的正序的最长上升序列和逆序最长上升之和,选择最大的即为最长的山脉。
题解:
class Solution:
# 求最长上升子序列
def LIS(self, A: List[int]) -> List[int]:
# print(A)
lena = len(A)
dp = [0] * lena
dp[0] = 0
for i in range(1, lena):
if A[i] > A[i - 1]:
dp[i] = max(dp[i - 1] + 1, 0)
# print(dp)
return dp
def longestMountain(self, A: List[int]) -> int:
lendp = len(A)
if lendp == 0:
return 0
# 求正向和反向的数组
forward_dp = self.LIS(A)
A.reverse()
backward_dp = self.LIS(A)
backward_dp.reverse()
lendp = len(forward_dp)
max_len = 0
# 选择最大的
for i in range(lendp):
if forward_dp[i] != 0 and backward_dp[i] != 0:
max_len = max(forward_dp[i] + backward_dp[i], max_len)
# print(max_len)
if max_len == 0:
return 0
else:
return max_len + 1