Given an unsorted array of integers, find the length of longest increasing subsequence.
For example,
Given [10, 9, 2, 5, 3, 7, 101, 18]
,
The longest increasing subsequence is [2, 3, 7, 101]
, therefore the length is 4
. Note that there may be more than one LIS combination, it is only necessary for you to return the length.
Your algorithm should run in O(n2) complexity.
Follow up: Could you improve it to O(n log n) time complexity?
以坐标i结尾的序列的最长递增子序列和其[0,i-1]“前缀”的最长递增子序列有关,设C[i]保存“以i结尾的最长递增子序列”的长度,若i=0,则 C[i]=1。否则C[i]的值和其[0,i-1]前缀的最长递增子序列长度有关,用j遍历[0,i-1]得到其最长递增子序列为C[j],对每一个C[j],如果L[j]<L[i]并且C[j]+1>C[i](初始化为0),则C[i]的值变为C[j]+1。即:
LIS[i]=max{1,LIS[j]+1},
其中array[i]>array[j],且j=[0,i-1]。
public class Solution {
public int lengthOfLIS(int[] nums) {
//[10, 2, 5, 3, 7],
if(nums==null || nums.length<1) return 0;
int [] d = new int[nums.length];
d[0] = 1;
int max = 1;
for(int i=1; i<nums.length; i++) {
d[i] = 1;
for(int j=0; j<i; j++) {
if(nums[i] > nums[j]) {
d[i] = Math.max(d[i], d[j]+1);
}
}
max = Math.max(max, d[i]);
}
return max;
}
}