请实现一个函数来判断整数数组 postorder
是否为二叉搜索树的后序遍历结果。
示例 1:
输入: postorder = [4,9,6,9,8] 输出: false 解释:从上图可以看出这不是一颗二叉搜索树
示例 2:
输入: postorder = [4,6,5,9,8] 输出: true 解释:可构建的二叉搜索树如上图
提示:
数组长度 <= 1000
postorder
中无重复数字
这个问题可以使用哈希表和递归来解决。我们可以定义一个二维数组 dp ,其中 dp[i][j] 表示在处理到第 i 个字符和第 j 个字符时,能够得到的最长递增路径。
具体来说,我们可以按照以下步骤来进行:
1. 初始化一个二维数组 dp 和两个整数变量 n 和 k 。
2. 对于每一个元素,我们有两种选择:将其加入当前子集中,或者不加入。然后,更新 dp 数组中的值。
以下是具体的代码实现:
```cpp
class Solution {
public:
bool isValidPostorder(vector<int>& postorder) {
int n = postorder.size();
unordered_map<int, int> m;
for (int x : postorder) {
m[x]++;
}
return dfs(postorder, 0, n - 1, m);
}
private:
bool dfs(vector<int>& postorder, int l, int r, unordered_map<int, int>& m) {
if (l > r) {
return true;
}
while (m[postorder[l]] == 0 || postorder[l] < postorder[r]) {
++l;
}
if (l != r + 1) {
return false;
}
--r;
while (l <= r && m[postorder[r]] == 0) {
--r;
}
return dfs(postorder, l, r - 1, m);
}
};
```
这个算法的时间复杂度是 O(n),空间复杂度是 O(n)。