查找最长的上升子序列C++
时间: 2025-05-18 19:08:36 浏览: 8
### C++ 实现最长上升子序列算法
以下是基于动态规划方法实现的 C++ 长度上升子序列(LIS)算法代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int longestIncreasingSubsequence(const vector<int>& nums) {
if (nums.empty()) return 0;
int n = nums.size();
vector<int> dp(n, 1); // 动态规划数组初始化为1
for(int i = 1; i < n; ++i){
for(int j = 0; j < i; ++j){
if(nums[i] > nums[j]){
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
return *max_element(dp.begin(), dp.end()); // 返回最大值作为结果
}
int main(){
vector<int> sequence = {5,6,7,1,2,8};
cout << "The length of the Longest Increasing Subsequence is: "
<< longestIncreasingSubsequence(sequence) << endl;
return 0;
}
```
上述代码通过两层嵌套循环来更新 `dp` 数组中的每一个位置,其中外层循环表示当前考虑的位置 \(i\),而内层循环用于寻找之前所有可能构成更长递增子序列的位置 \(j\)。如果满足条件 \( \text{nums}[i] > \text{nums}[j]\),则尝试更新 \( \text{dp}[i] \)[^3]。
此算法的时间复杂度为 O(n²),适用于较小规模的数据集。对于更大的数据量,可以采用二分查找优化的方法进一步降低时间复杂度至 O(n log n)[^4]。
#### 关于二分查找优化版本
为了提高效率,在某些情况下可利用贪心策略配合二分查找技术完成 LIS 计算过程。这种方法的核心思想在于维护一个记录潜在候选者最小结尾数值的列表,并不断调整它以适应新加入元素的影响。
```cpp
#include <bits/stdc++.h>
using namespace std;
int lis_optimized(vector<int>& nums){
vector<int> tails;
for(auto num : nums){
auto it = lower_bound(tails.begin(), tails.end(), num);
if(it == tails.end()){
tails.push_back(num);
}
else{
*it = num;
}
}
return tails.size();
}
int main(){
vector<int> seq={10,9,2,5,3,7,101,18};
cout<<"Optimized Length:"<<lis_optimized(seq)<<endl;
return 0;
}
```
该段代码展示了如何运用 STL 中的函数 `lower_bound()` 来执行高效的二分搜索操作,从而显著减少整体运行时间开销。
阅读全文
相关推荐


















