问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…<sn并且这个子序列的长度最长。简称LIS。

例如,对于数组[10, 9, 2, 5, 3, 7, 101, 18],它的最长递增子序列为[2,3,7,101],长度为4。当然最长递增子序列不止一个,例如[2,5,7,101],[2,5,7,18]都符合要求。

1.时间复杂度:O(n^2)

对于序列A(a1,a2,a3…..an),以序列中am元素为最小值的递增序列,只与am-1,am-2,……an有关,与am之前的元素无关,因此我们可以由后向前依次求出以每个元素为起始的最长递增序列。我们用一个数组flag存储最长递增子序列的长度,若i<j,A[i] < A[j],则flag[i] = max(flag[x], j <= x <= A.length) + 1。

   1: public int lengthOfLIS(int[] nums) {

   2:                 if (nums == null || nums.length == 0)

   3:                         return 0;

   4:                 int[] flag = new int[nums.length];

   5:                 Arrays.fill(flag,1);

   6:                 int maxLength = 1;

   7:                 for (int i =nums.length - 2; i >= 0; i--){

   8:                         int maxTemp = flag[i];

   9:                         for (int j = i+1; j < nums.length;j++){

  10:                                 if (nums[i] < nums[j]){

  11:                                         maxTemp = maxTemp > flag[j] + 1 ? maxTemp : flag[j] + 1;

  12:                                 }

  13:                         }

  14:                         flag[i] = maxTemp;

  15:                         maxLength = maxLength > flag[i] ? maxLength: flag[i];

  16:                 }

  17:                 return maxLength;

  18:         }

2.时间复杂度O(nlogN)

我们定义一个数组dp[],dp[i]表示长度为i的序列中最小的元素的值。例如对于序列A[10, 9, 2, 5, 3, 7, 101, 18],我们依次扫描每个元素,

首先对于A[0] = 10 , 我们可以得dp[1] = 10 ,表示序列长度为1的最小元素为10,此时序列为10,

对于A[1] = 9, 因为A[1] < dp[1],所以dp[1] = 9,此时序列为9

对于A[2] = 2, 因为A[2] < dp[1],所以dp[1] = 2,此时序列为2

对于A[3] = 5, 因为A[3] > dp[1],所以dp[2] = 5,此时序列为2,5

对于A[4] = 3, 因为A[4] < dp[2],所以dp[2] = 3,此时序列为2,3

对于A[5] = 7, 因为A[5] > dp[2],所以dp[3] = 7,此时序列为2,3,7

对于A[6] = 101, 因为A[6] > dp[3],所以dp[3] = 101,此时序列为2,3,7,101

对于A[7] = 18, 因为A[7] < dp[3],所以dp[3] = 18,此时序列为2,5,7,18

所以最长递增子序列的长度为4

   1: int[] dp = new int[nums.length];

   2:                 int len = 0;

   3:  

   4:                 for(int x : nums) {

   5:                         int i = Arrays.binarySearch(dp, 0, len, x);

   6:                         if(i < 0) i = -(i + 1);

   7:                         dp[i] = x;

   8:                         if(i == len) len++;

   9:                 }

  10:  

  11:                 return len;

Longest Increasing Subsequence的两种算法的更多相关文章

  1. Longest Increasing Subsequence的两种解法

    问题描述: 给出一个未排序队列nums,如[10, 9, 2, 5, 3, 7, 101, 18].找出其中最长的增长序列,但不是连续增长序列,如[2, 3, 7, 101]就是对应的最长增长序列LI ...

  2. [LeetCode] Longest Increasing Subsequence 最长递增子序列

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  3. 最长上升子序列 LIS(Longest Increasing Subsequence)

    引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…< ...

  4. Longest Increasing Subsequence - LeetCode

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  5. [LeetCode] 300. Longest Increasing Subsequence 最长递增子序列

    Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Inp ...

  6. [tem]Longest Increasing Subsequence(LIS)

    Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...

  7. [LintCode] Longest Increasing Subsequence 最长递增子序列

    Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return ...

  8. 300最长上升子序列 · Longest Increasing Subsequence

    [抄题]: 往上走台阶 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的. 样例 给出 [5,4,1,2,3],LIS 是 [1,2 ...

  9. 673. Number of Longest Increasing Subsequence最长递增子序列的数量

    [抄题]: Given an unsorted array of integers, find the number of longest increasing subsequence. Exampl ...

随机推荐

  1. 使用 StoryBoard 制作一个能够删除cell的TableView

    本篇博客方便自己检索使用.资源链接 下面是制作效果图,点击删除按钮,就能将该cell删除: 下面是主要的代码: #define KSUPER_TAG 20000 #define KDEFAU_TAG ...

  2. ping测试网络

    https://jingyan.baidu.com/article/ac6a9a5e109d5f2b653eacbc.html 百度百科:https://baike.baidu.com/item/pi ...

  3. Win10资源管理器中的库文件夹按照修改日期排序

    win7之后添加的库十分的好用,可以将下载,音乐,文档设置在我的电脑(win10叫此电脑)首页,快速进入. 我对文件夹设置了按照时间排序,这样进去就可以直接看到最近下载了什么文件.但是win10用时间 ...

  4. Subsets Forming Perfect Squares

    题意: 给出n个数字,选出若干个数字,使得这些数字的乘积是一个完全平方数,问有多少种选法. 解法: 考虑异或方程组,$x_i$表示第i个数字是否选, 注意到只要保证结果中各个质因数都出现偶数次就可保证 ...

  5. 激光SLAM

    1.激光分类 维度分类: a.二维激光(单点反射.平面.旋转台) b.三维激光 距离分类: a.近距离:壁障.碰撞检测.路边检测 b.远距离:行人检测.定位.建图 特点: 优点: a.可以直接获取深度 ...

  6. httpd基础

    hpptd http服务器应用 http服务器程序 httpd apache nginx lighttpd 应用程序服务器 IIS .asp tomcat .jsp jetty 开源的servlet容 ...

  7. HDU - 2037 今年暑假不AC 贪心(求序列中不重叠子序列的最大值问题)

    HDU2037 今年暑假不AC  贪心算法 大意: 每次测试数据输入一个n,然后输入n对的电视节目播放时间:开始时间及结束时间, 求这个人能看的最多的完整的节目数. 解题思路: 对于这道解题,是对每个 ...

  8. Asp.net后台创建HTML

    为了使HTML界面中的内容能根据数据库中的内容动态显示用户需要的内容,或者根据权限不同要显示同而实现页面内容的动态创建 使用HtmlGenericControl创建HTML标签 引入命名空间: usi ...

  9. 网络编程-TCP连接-length

    在使用readLine方式时,常常会遇到因为没有结束标记,而导致阻塞现象. 如果不想使用结束标记,这里可以使用一个固定长度的byte[],来获取流. server package com.net.tc ...

  10. Android-毛笔的探索与开发

     前言 这篇文章主要是关于移动端毛笔的开发,在平板上有着书写毛笔字贴的效果. 介绍关于毛笔的算法思路. 项目github地址 算法思路分析 曲线拟合算法 利用曲线拟合算法增加虚拟的点,使得笔迹更加光滑 ...