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?
题目大意:给你一个未排序的整数数组,找到最长的递增,举个例子
[10, 9, 2, 5, 3, 7, 101, 18]
,最长的递增子序列是 [2, 3, 7, 101]
,因此长度是4,你需要做的就是返回最长的长度。
分析:
这个数组未排序,很自然的一个想法是从当前的一个数字出发,在它之后寻找有多长的递增序列,这个想法我没实现下去,
因为我觉得我没想全,比如说从2出发,然后到了5,然后再到7,再到101,[2,5,7,101],由于这里最长长度是4,
所以刚好碰巧没啥问题,但是最长长度不一定是顺着下去的,你还需要考虑跳过5,从3找下去的可能,
[2,3,7,101]也是长度为4,我的起初想法是设置一个标志位,但这样的话循环高至三层了,索性就不去想了。换思路。
查了资料有挺多的做法,这里我列一个好懂的想法,
设置一个lis数组,lis[i]代表是到下标为i的为之前,最长的递增序列长度,两层循环,
外层循环选择当前下标,内层循环更新当前下标的lis值,内层循环
每次都是从头开始到当前下标为止。
public int lengthOfLIS(int[] nums) {
if(nums.length==0)
return 0;
int[] lis=new int[nums.length];
int max=0;
for(int i=0;i<nums.length;i++)
{
int localMax=0;
for(int j=0;j<i;j++) {
if(localMax<lis[j]&&nums[j]<nums[i])
localMax=lis[j];
}
lis[i]=localMax+1;
max=Math.max(max, lis[i]);
}
return max;
}