题目要求
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]
。
思路一:动态规划
从动态规划的角度来说,假设要计算以第i位为结尾所构成的最长递增子数组,并且我们已经知道了第0位,第1位...第i-1位的任何一个值为最后一个数字时所能构成的最长子数组的长度。那么我们只需要从中找到值比当前小的值的下标,并且比较二者构成的子数组的长度,再从中获得最大长度的递增子数组,作为当前数组为最后一个值所构成的递增子数组的最大长度。
最后我们还需要遍历一遍全部子数组的长度并获得最大的长度。
public int lengthOfLIS(int[] nums) {
int length = nums.length;
if(length==0) return 0;
int T[] = new int[nums.length];
for(int i = 1 ; i<length ; i++){
for(int j = i-1 ; j>=0 ; j-- ){
if(nums[j] < nums[i] && T[j] + 1 > T[i]){
T[i] = T[j] + 1;
}
}
}
int max = 0;
for(int cur : T){
max = Math.max(cur, max);
}
return max+1;
}
思路二:大牛思路
这里附上一个解释的非常好的文章,我根据其思路的实现如下:
public int lengthOfLIS2(int[] nums){
int length = nums.length;
if(length == 0) return 0;
int[] tmp = new int[length];
tmp[0] = nums[0];
int max = 1;
for(int i = 1 ; i<length ; i++){
for(int j = max-1; j>=0 ; j--){
if(j==0 && nums[i] < tmp[j]) tmp[j] = nums[i];
else if(j == max-1 && nums[i] > tmp[j]){
tmp[j+1] = nums[i];
max++;
break;
}
else if(nums[i] < tmp[j] && nums[i] >tmp[j-1]){
tmp[j] = nums[i];
break;
}
}
}
return max;
}
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。