改进的方法看的头大了却还是不清楚,哎。。。搞算法的苦啊,纠结啊。

编程之美这本书里面就有关于这道题的一些解法,求一个一位数组中的最长序列的长度。例如,在序列1,3,2中,最长递增序列是1,3.

这道题,也是腾讯2012校园招聘中的一道题,其实,这道题符合无后效性的要求,我们可以任取从从数组开始时开始的任意子序列,这个子序列的状态无法直接影响将来的决策。换句话说,每个状态是过去历史的一个完整总结。

我们可以定义一个存放每个子序列的最长序列值的数组L,L里面元素的初始值为1,那么不断增长子序列,当遍历到元素i时,如果i代表的元素比前面出现的子序列中的某一元素大的话,那么对应的L数组里面的值就要增一。对应的代码如下.

for(int i=0;i

:L[i] = 1; //初始化长度为1

for(int j=0;j

if(array[i] > array[j]&&L[i]

L[i] = L[j] + 1;

}

}

return max(L);

}

这种方法对应的时间复杂度是O(N2+N)= O(N2);

其实,我们做到这里的时候,算是初步完成了,但是,我们有时会想,是不是可以进行一点优化,让速度更快?

编程之美里面提供了一中较好的方法,是这样的,它提前记录了前i个元素中,每个子序列中的最小值,MIN(1),MIN(2).。。。。。然后,对于第i+1个元素,那么只要遍历这些元素,然后对应的最长值增一就行了。好,我们先看一下代码。

MIN[0] = min(array) - 1;//边界,用于子序列为1时可以比较

MIN[1] = array[0];//初始值。

for(0...n-1)

L[i] = 1;//初始化最长子序列

MAXLEN = 1;//最长的子序列数

for(int i=1;i

for(int j=MAXLEN;j>=0;j--){

if(array[i] > MIN[j]){

L[i] = j+1;

break;

}

}

if(L[i] > MAXLEN){

MAXLEN = L[i];

MIN[MAXLEN] = array[i]

}else if(array[j]

MIN[j+1] = array[i];

}

return MAXLEN;

}

咋看一下,其实时间复杂度还是0(n2),但是对于这个我们增加的一个序列对应的最小值,其实具有

单调递增的关系,所以对于这一部分

for(int j=MAXLEN;j>=0;j--){

if(array[i] > MIN[j]){

L[i] = j+1;

break;

}

我们其实可以用二分搜索进行查找,那么时间复杂度就变成了0(n*logN);

c语言找出递增子数组的长度,编程之美2.16 数组中最长递增子序列的长度相关推荐

  1. 求数组中最长递增子序列的长度

    题目:写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例:在序列[1, -1, 2, -3, 4, -5, 6, -7]中,其最长递增子序列的长度为4([1, 2, ...

  2. Java输出数组中最长递增子序列的代码

    下面内容是关于Java输出数组中最长递增子序列的内容,希望对大伙有较大用途. package com.wzs;import java.util.ArrayList; import java.util. ...

  3. 程序员面试100题之十二:求数组中最长递增子序列

    写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长递增子序列为1,2,4,6. 分析与解法 根据题目要求, ...

  4. 编程之美2.16 最长递增子序列

          这道题目要求返回一个数字,这个数字代表一个数组中最长的递增子序列,当然,不要求这个序列是连续的,比如,有这样一个数组:{1, 3,5,7, 2, 9},那么这个数组的最长递增子序列就是5, ...

  5. 求数组中最长递增子序列

    写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例如: arr[] = {1, -1, 2, -3, 4, -5, 6, -7},其最长递增子序列的长度为4 如(1 ...

  6. 每日一题(79) - 求数组中最长递增子序列

    题目来自编程之美 题目 思路(1) 动态规划(复杂度为n^2) 方程: F[i]:表示以nArr[i]为结尾的最长递增子序列的最大长度. F[i] = Max(F[j]) + 1 && ...

  7. 编程之美-求数组中最长递增子序列(LIS)方法整理

    [试题描述] 方法一:时间复杂度O(n^2) 方法二:时间复杂度O(n^2) 方法三: 修改方法二中的穷举搜索部分为如下: 如果把上述查询部分利用二分搜索进行加速,可以得到时间复杂度为O(nlogn) ...

  8. 数组的最长递减子序列java_最长递增/递减子序列

    <编程之美>里有个题目是要求数组中最长递增子序列,在CSDN上看到的题目是数组中的最长递减子序列.题目如下: 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子 ...

  9. c语言找出一个数组中出现次数最多的那个元素,c语言找出数组中出现次数最多地那个元素...

    matlab中如何找出不同维度矩阵出现次数最多的数组并记录其个数 首先是胞矩阵中的序列问题,不妨假设AA{1}是一个多行两列的数据,AA{2}同例.程序如下clcclearallAA{1}=[12;2 ...

最新文章

  1. 设置让TortoiseGit记住账号和密码
  2. 谷歌最新提出无需卷积、注意力 ,纯MLP构成的视觉架构
  3. Java黑皮书课后题第3章:**3.28(几何:两个矩形)编写一个程序,提示用户输入两个矩形中心的x坐标和y坐标以及矩形的宽度和高度,然后判断第二个矩形是在第一个矩形内,还是和第一个矩形重叠
  4. 计算机辅助工艺设计张胜文,计算机辅助工装设计.ppt
  5. linux输入法源,Manjaro Linux 添加源及输入法
  6. 使用screen管理后台程序
  7. 【STM32】HAL库 STM32CubeMX教程六----定时器中断
  8. 机器学习——LightGBM
  9. linux tcp前景,linux – 为什么在Xen下TCP接受()性能如此糟糕?
  10. java 鼠标拖拽_JavaScript DOM 鼠标拖拽
  11. AMD,CMD,UMD,CommonJS
  12. 微信游戏推荐系统大揭秘
  13. python编程和excel_Excel Vs. Python?为Excel正名
  14. cortana 无法使用_如何使用Cortana创建和编辑列表(并将它们与Wunderlist同步)
  15. 2021-11-13偏最小二乘法应用实例python程序代码
  16. 使用Mozilla Thunderbird 创建ics日历文件
  17. iOS开发- 以图搜图功能实现 (源码+解析)
  18. Matlab 元胞数组和结构体
  19. python 提取元组中的值_如何从Python元组中提取数据?
  20. [TJOI2013] 单词

热门文章

  1. 【SSH网上商城项目实战18】过滤器实现购物登录功能的判断
  2. xdu1068暨2013陕西省赛C题题解
  3. Go语言的类型系统 - 翻译
  4. TCP/IP详解卷1 - wireshark抓包分析
  5. [转]每秒处理10万订单乐视集团支付架构
  6. 设计模式总结(Java)—— 单例模式
  7. 好程序员训练营-Java变量的作用域
  8. Etherchannel 备忘
  9. csrss.exe系统进程介绍
  10. 微服务怎么部署到服务器的_微服务的部署与发布:持续交付与持续部署微服务...