LeetCode491--递增子序列★★C++
时间: 2024-12-02 17:27:56 浏览: 9
LeetCode 题目 491 - 递增子序列 (Incremental Subsequence) 是一道关于算法设计的中等难度题目。这道题要求你在给定整数数组 nums 中找出所有长度大于等于 1 的递增子序列。递增子序列是指数组中的一串连续元素,它们按照顺序严格增大。
解决这个问题的一个常见策略是使用动态规划(Dynamic Programming),特别是哈希表或者单调栈(Monotonic Stack)。你可以维护一个栈,每当遍历到一个比栈顶元素大的数字时,就将它推入栈,并更新当前最长递增子序列的长度。同时,如果遇到一个不大于栈顶元素的数字,就从栈顶开始检查是否存在更长的递增子序列。
以下是 C++ 解决此问题的一种简单实现:
```cpp
class Solution {
public:
vector<int> lengthOfLIS(vector<int>& nums) {
int n = nums.size();
if (n == 0) return {};
// 使用单调栈存储当前已知的最大子序列
stack<pair<int, int>> stk;
stk.push({nums[0], 1});
for (int i = 1; i < n; ++i) {
while (!stk.empty() && nums[i] > stk.top().first) {
// 如果新数大于栈顶元素,找到一个更长的递增子序列
int len = stk.top().second + 1;
ans.push_back(len);
stk.pop();
}
// 如果新数不大于栈顶元素,尝试从当前位置开始寻找更长子序列
if (!stk.empty()) {
stk.top().second = max(stk.top().second, 1);
} else {
stk.push({nums[i], 1});
}
}
return ans;
}
private:
vector<int> ans;
};
```
在这个解决方案中,`ans` 存储所有的递增子序列长度,最后返回这个结果向量即可。
阅读全文