返回

打破常规,深入理解山脉的结构——LeetCode 845:数组中的最长山脉

闲谈

前言

LeetCode 845:数组中的最长山脉是一道经典的算法题,它要求你在给定的数组中找到最长山脉的长度。山脉的定义是:数组中存在一个连续子数组 B,满足以下条件:

  • B.length >= 3
  • 存在 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i]
  • 存在 i < j < B.length - 1 使得 B[j] > B[j+1] > ... > B[B.length - 1]

动态规划算法

为了解决这个问题,我们可以使用动态规划算法。动态规划算法是一种自底向上的算法,它将问题分解成更小的子问题,然后逐步解决这些子问题,最终得到问题的整体解决方案。

在 LeetCode 845:数组中的最长山脉中,我们可以定义一个状态 dp[i],表示以第 i 个元素结尾的最长山脉的长度。那么,我们可以根据以下公式来计算 dp[i]:

dp[i] = max(dp[i-1], 1 + dp[j])

其中,j 是满足以下条件的最大索引:

  • 0 <= j < i
  • A[j] < A[j+1] < ... < A[i]

代码示例

以下是在 C++、Python 和 Java 中的代码示例:

class Solution {
public:
    int longestMountain(vector<int>& arr) {
        int n = arr.size();
        vector<int> dp(n, 1);
        int maxLen = 0;
        for (int i = 1; i < n; i++) {
            if (arr[i] > arr[i-1]) {
                dp[i] = dp[i-1] + 1;
            }
        }
        for (int i = n-2; i >= 0; i--) {
            if (arr[i] > arr[i+1]) {
                dp[i] = max(dp[i], 1 + dp[i+1]);
                maxLen = max(maxLen, dp[i]);
            }
        }
        return maxLen;
    }
};
def longestMountain(arr):
    n = len(arr)
    dp = [1] * n
    maxLen = 0
    for i in range(1, n):
        if arr[i] > arr[i-1]:
            dp[i] = dp[i-1] + 1
    for i in range(n-2, -1, -1):
        if arr[i] > arr[i+1]:
            dp[i] = max(dp[i], 1 + dp[i+1])
            maxLen = max(maxLen, dp[i])
    return maxLen
class Solution {
    public int longestMountain(int[] arr) {
        int n = arr.length;
        int[] dp = new int[n];
        int maxLen = 0;
        for (int i = 1; i < n; i++) {
            if (arr[i] > arr[i-1]) {
                dp[i] = dp[i-1] + 1;
            }
        }
        for (int i = n-2; i >= 0; i--) {
            if (arr[i] > arr[i+1]) {
                dp[i] = Math.max(dp[i], 1 + dp[i+1]);
                maxLen = Math.max(maxLen, dp[i]);
            }
        }
        return maxLen;
    }
}

结论

通过本文,我们对 LeetCode 845:数组中的最长山脉有了更深入的理解。我们介绍了动态规划算法的思想,并提供了 C++、Python 和 Java 的代码示例。希望本文对你的算法学习有所帮助。