最长连续递增子序列

思路很简单,记下当前最长的子序列的开头结尾与之前找到的最长子序列的开头结尾

然后一遇到非递增的部分就比较两个子序列,修改开头结尾即可,只需扫描一遍数组,这玩意没法弄的比o(n)小吧

#include<stdio.h>

int main(){
    int nums[100000];
    int i,n,s,e,ts,te;
    scanf("%d",&n);
    for(i=1;i<=n;i++) scanf(" %d",&nums[i-1]);

    ts=te=s=e=0;
    for(i=1;i<=n-1;i++){
        if(nums[i]<=nums[i-1]){
            if(te-ts>e-s){//当前子序列更长,更新最长子序列
                s=ts;
                e=te;
            }
            ts=te=i;
        }
        else te=i;
    }
    if(te-ts>e-s){//结束时再判断一次
        s=ts;
        e=te;
    }

    for(i=s;i<=e-1;i++) printf("%d ",nums[i]);
    printf("%d",nums[i]);
    return 0;
}

 

上一篇:如何在 GPU 上优化卷积


下一篇:编译原理: FIRST(x) FOLLOW(x) SELECT(x)的计算