classSolution{public:intlengthOfLIS(vector<int>& nums){
vector<int> ret;
vector<int>maxlen(nums.size(),0);
vector<int>path(nums.size(),-1);int pos =0, size = nums.size();while(pos < size){if(ret.empty()|| nums[pos]> nums[ret.back()]){
path[pos]=(pos ? ret.back():-1);
maxlen[pos]= ret.size()+1;
ret.emplace_back(pos);++pos;continue;}for(int i = ret.size()-1; i >=0;--i){if(nums[ret[i]]> nums[pos]&&(!i || nums[ret[i -1]]< nums[pos])){
path[pos]=(i ? ret[i -1]:-1);
maxlen[pos]= i +1;
ret[i]= pos;break;}}++pos;}int ans =0, last_idx =0;for(int i =0; i < maxlen.size();++i){if(maxlen[i]> ans){
last_idx = i;
ans = maxlen[i];}}do{
cout << nums[last_idx];
last_idx = path[last_idx];if(last_idx !=-1) cout <<"->";}while(last_idx !=-1);return ans;}};
代码实现(七刷自解 DAY 3 Golang)
funclowerbound(nums []int, target int)int{
left, right :=0,len(nums)-1for left < right {
mid :=((right - left)>>1)+ left
if nums[mid]< target {
left = mid +1}else{
right = mid
}}return left
}funclengthOfLIS(nums []int)int{iflen(nums)==0{return0}
dp :=[]int{nums[0]}for i :=1; i <len(nums); i++{if nums[i]> dp[len(dp)-1]{
dp =append(dp, nums[i])}else{
dp[lowerbound(dp, nums[i])]= nums[i]}}returnlen(dp)}