思路很简单,记下当前最长的子序列的开头结尾与之前找到的最长子序列的开头结尾
然后一遇到非递增的部分就比较两个子序列,修改开头结尾即可,只需扫描一遍数组,这玩意没法弄的比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; }