#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
vector<int> LDS(vector<int> data){
vector<int> result;
int end=0;
result.push_back(data.at(0));
for(int i=1;i<data.size();i++){
if(data.at(i)<result.back()){
result.push_back(data.at(i));
end=i;
}else{
*lower_bound(result.begin(),result.end(),data.at(i),[](int para1,int para2){return para1>para2;})=data.at(i);
end=i;
}
}
vector<int> ans;
ans.push_back(result.back());
int size=result.size();
vector<int>::iterator it_up=result.end()-2,it_low=data.begin()+end;
for(vector<int>::iterator it=it_low;ans.size()<size;it--){
if(*it>*it_low&&*it<=*it_up){
ans.push_back(*it);
it_low=it;
it_up--;
}
}
reverse(ans.begin(),ans.end());
return result;
}
int main(){
int d[] ={7,9,8,4,6,3,5,1,2};
vector<int> data,ans;
data.assign(d,d+9);
ans=LDS(data);
cout<<"data:"<<endl;
copy(data.begin(),data.end(),ostream_iterator<int>(cout,","));
cout<<endl;
cout<<"LDS:"<<endl;
copy(ans.begin(),ans.end(),ostream_iterator<int>(cout," "));
return 1;
}
用STL实现复杂度O(nlogn)的LDS算法
最新推荐文章于 2021-05-20 05:43:27 发布