【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值