思路很简单,记下当前最长的子序列的开头结尾与之前找到的最长子序列的开头结尾
然后一遇到非递增的部分就比较两个子序列,修改开头结尾即可,只需扫描一遍数组,这玩意没法弄的比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; }
标签:结尾,int,递增,ts,开头,序列,te,最长 来源: https://www.cnblogs.com/lwind/p/15426289.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。