博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【100题】 第四十七题 序列的最长递增、递减序列
阅读量:5818 次
发布时间:2019-06-18

本文共 2276 字,大约阅读时间需要 7 分钟。

一,题目

       求一个数组的最长递减子序列

               比如{94325432}的最长递减子序列为{95432}

      

       求一个数组的最长递增子序列

               比如{1,-1,2,-3,4,-5,6,-7}的最长递减子序列为{12436}

             

二,递增序列长度求解方法

       解法一:

                     时间复杂度为 o(n^2)

                     遍历数组序列,每遍历一个数组元素,则求序列到当前位置 最长的递增序列数,用temp[i]存储。

                     注意,当前的最长递增子序列受已经遍历的最长递增子序列影响,从序列头 再遍历到当前位置的前一个位置,挨个比较 a[j]与a[i](当前元素)大小,遇到小于a[i]且判断需要更新

temp[]数组。

     由于这里仅仅是求,最长递增序列的长度,所以仅仅用temp[]存储长度大小。

                                                                                                                                                                        源码:

 

#include 
using namespace std;int LIS(int array[],int n){ int temp[n];//存放当前遍历位置最长序列 for(int i=0;i
array[j] && temp[j]+1 > temp[i] ) { temp[i] = temp[j] + 1; } } } int max=temp[0]; for(int k=0;k
       解法二:时间复杂度任然为 O(n^2)

      为了减少比较次数

      采用空间换时间的策略。新增一个数组MaxV[],max[i]表示所有长度为i的递增子序列中最大值之间的最小值

      nMaxlax记录当前最长子序列

      每次遍历一个元素时候,从最长子序列开始遍历,一直到1 比较当前元素值arr[i] 跟MaxV[j]的值,从而更新temp[]最长子序列和nMaxLax和MaxV[]的值

  源码:

#include 
using namespace std;int LIS(int array[],int n){ int temp[n];//存放当前遍历位置最长序列 int MaxV[n]; //最长子序列中最大值之间的最小值 MaxV[1]=array[0];//初始序列长度为1的子序列 中最大值的最小值 MaxV[0]=-9999;//边界值 for(int i=0;i
=0;--j) //找出前面最长的序列 { if(array[i]>MaxV[j])//当前值大于长度为j的子序列中最大值之间的最小值 { temp[i] = j + 1; break; } } if(temp[i]>nMaxLis)//在最长子序列时停止 (这时只有一个最长的) { cout<<"nMaxLIs"<
<
  解法三:

      将内循环查询部分换成二分搜索,则时间复杂度降低为 O(nlogN)

                   

 

三,递减序列 最长子序列求解方法

        用index数组,从大到小排序。然后依次遍历元素,查找元素在index数组中的位置pos ,根据位置来判断当前最长的子序列。

 

#include
#include
#include
using namespace std ;int BiSearch(int *A,int nTarget,int nLen);void FindLongestSequence(int *A,int nLen){ int *index=new int[nLen];//存放子序列 int *LDS=new int[nLen]; index[0]=A[0]; LDS[0]=1; int indexLen=1; //最长递增子序列 长度 for (int i=1;i
=indexLen)//插入的当前位置大于最长序列 indexLen++; } int ResultLen=indexLen; for (int i=nLen;i>=0;i--)//记录最长递减子序列 { if(LDS[i]==ResultLen) { index[ResultLen-1]=A[i]; ResultLen--; } } for (int i=0;i
0); int start=0; int end=nLen-1; while (start<=end) { int mid=(start+end)/2; if(nTarget>A[mid]) end=mid-1; else if(nTarget

 

 

转载于:https://www.cnblogs.com/secbook/archive/2012/08/20/2654960.html

你可能感兴趣的文章
看了极光推送技术原理的几点思考
查看>>
2018 年全球互联网十大数据泄露事件盘点
查看>>
layim的websocket消息撤回功能实现
查看>>
区块链太火,小心你的服务器被动挖矿!
查看>>
查看当前Java进程工具jps(转)
查看>>
django 1.8 官方文档翻译: 2-5-6 多数据库
查看>>
四,ESP8266 TCP服务器(基于Lua脚本语言)
查看>>
哈佛商业评论:关于区块链的真相
查看>>
linux中内存使用原理
查看>>
量子回路终于制成,量子计算机指日可待
查看>>
12 Open Source Projects by Alibaba – Part 1
查看>>
python【4】-函数
查看>>
调整窗口大小也能够实现div水平垂直居中代码实例
查看>>
PostgreSQL数据库 OLTP高并发请求性能优化
查看>>
联想2017TechWorld大会举行 联想未来瞄准AI
查看>>
出国就医不用慌,日本推出“医用语音翻译系统”
查看>>
ansible常用模块详解
查看>>
开启人工智能新时代,首款神经网络处理器“寒武纪”即将上市
查看>>
大神解答:如何实现域账号免登陆流程平台的功能
查看>>
干货|全面分析GAN,以及如何用TF实现GAN?
查看>>