【Leetcode 每日一题】845. 数组中的最长山脉(动态规划预处理,求最长上升和最长下降和的最大值)

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

猜你喜欢

转载自blog.csdn.net/qq_37753409/article/details/109270068