题目
最长上升子序列
给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。
样例
给出[5,4,1,2,3],这个LIS是[1,2,3],返回 3
给出[4,2,4,5,3,7],这个LIS是[4,4,5,7],返回 4
挑战
要求时间复杂度为O(n^2) 或者O(nlogn)
说明
Java Code
最长上升子序列的定义:
- 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。
- https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
解题
下面是很久前复制网上的程序
public class Solution { /** * @param nums: The integer array * @return: The length of LIS (longest increasing subsequence) */ public int longestIncreasingSubsequence(int[] nums) { // write your code here int numlen = nums.length; if(numlen ==0 ) return 0; int d[] = new int[numlen]; // 以nums[i] 结束的最长升序子序列的长度 默认值是 1 在全部逆序的情况, // for(int i = 0 ;i< numlen ; i++) // d[i] = 1; d[0] = 1; int dmax = 1; for(int i = 1 ; i< numlen;i++){ int subdmax = 0; // 这里记录的是以i结束的升序子序列中,去除第i个元素的长度,显然默认是0 for(int j = 0; j< i ;j++){ if(nums[j] <= nums[i]){ subdmax = Math.max(d[j],subdmax);// 求出i所在升序子序列中,去除第i个元素后,最长的升序子序列长度 } } d[i] = subdmax + 1; dmax = Math.max(dmax,d[i]); } return dmax; } }
下面写下自己的理解
求的最长子序列的数不是连续的,数之间是有间隔的,但是他们是升序的,或者说是非递减的序列。
前面做过一些关于动态规划的题目,都是喜欢定义一个数组,A,A[i] 表示到达当前 i 位置 的某种 意义,如:最大值个数,最小值个数,长度等等。
这里也是定义一个数组sublongest sublongest[i] 表示到i 位置的最长升序子序列的长度。
到达第