贪心算法,遍历数组arr,每次都取尽量长的递增子序列,保存在result中;数组max_len用于保存arr[0,i]的元素中小于等于arr[i]的元素的个数。最后根据等式max_len[i]==j选择最终的结果,表示递增子序列的第j个元素应该这么选:它正好就是arr数组中的元素arr[i],满足arr[i]的前面有j个元素小于等于arr[i](也就是说此arr[i]是arr数组中的第j小元素)。
class Solution {
public:
/**
* retrun the longest increasing subsequence
* @param arr int整型vector the array
* @return int整型vector
*/
vector<int> LIS(vector<int>& arr) {
vector<int> result{};
vector<int> max_len{}; //保存arr[0,i]中小于等于arr[i]的个数
if(arr.empty()) return result;
result.push_back(arr[0]);
max_len.push_back(1);
for(int i=1;i<arr.size();i++){
if(arr[i]>result.back()){
result.push_back(arr[i]);
max_len.push_back(result.size());
}
else{
int pos=lower_bound(result.begin(), result.end(), arr[i]) - result.begin();
result[pos]=arr[i];
max_len.push_back(pos+1);
}
}
for(int i=arr.size()-1,j=result.size();j>0;i--){
if(max_len[i]==j){
result[--j]=arr[i];
}
}
return result;
}
};