最长上升子序列----nlogn算法-模板
  VrZI4Uwu8BR1 2023年11月02日 43 0



#include<iostream>
#include<vector>
#define MAX 1010
using namespace std;
vector<int> len;

// 这里我返回的满足len[k]>=val[i]且k最小的位置

// 和上文红色部分的描述是等价的,只是变成了更新len[k],而不是len[k+1]
int bisearch(int val){
    int left=0, right=len.size()-1;
    while(left<=right){
        int mid = (left+right)>>1;
        if(len[mid] < val) left = mid+1;
        else right = mid-1;
    }   
    return left;
}

int main(){
    int n, val;
    cin>>n;
    for(int i=0; i<n; ++i){
        cin>>val;
        int k = bisearch(val);
        if(len.size()==k) len.push_back(val);
        else len[k] = val;
    }   
    cout<<len.size()<<endl;
    return 0;
}


二分查找用函数:

#include<iostream>
#include<algorithm>
#define MAX 1010
using namespace std;

int p[1010];
int main(){
    int n, val;
    cin>>n;
	int cnt=0;
    for(int i=0; i<n; ++i){
        cin>>val;
        int k = lower_bound(p,p+cnt,val)-p;
        if(cnt==k) p[cnt++]=val;
        else p[k] = val;
    }   
    cout<<cnt<<endl;
    return 0;
}






【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读