返回
打破常规,深入理解山脉的结构——LeetCode 845:数组中的最长山脉
闲谈
2023-09-12 21:57:16
前言
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 的代码示例。希望本文对你的算法学习有所帮助。