LeetCode 300:Longest Increasing Subsequence
1.题目描述:
给定一个无序数组,找到最长的递增子序列(这个递增序列可以不连续),输出它的长度(可能存在很多个递增序列,这里只需要输出长度即可)例如:
要求:时间复杂度为O(n^2)
输入:[10,9,2,5,3,7,101,18]
输出:4。。。最长递增子序列为[2,3,7,101]或者[2,3,7,18]
2.解题思路:
这是一个典型的动态规划问题。我们创建一个长度为n的数组(n等于给定数组的长度)dp来保存到达每一个数字的最长子序列的长度,首先全部初始化为1,因为本身一个数字就是一个递增序列,长度为1。接下来我们使用第i个数字和它之前的每一数字j进行比较,如果nums[i] > nums[j],那么我们就把之前的最大值max进行比较,把最大的数字放进dp[i]中。然后同时把max和结果进行比较,获得全局最大值res,等到循环结束后,res就是要输出的结果。本解决方法时间复杂度O(n^2),空间复杂度是O(n).
Java 代码如下:
public class Main {
public static int lengthOfLIS(int[] nums) {
if(nums.length == 0)return 0;
int[] dp = new int[nums.length];
for(int index = 0;index < nums.length; index++){
dp[index] = 1;
}
int res = 1;
for(int i = 1;i < nums.length;i++){
int max = 1;
for(int j = 0;j < i;j++){
if(nums[i] > nums[j]){
max = Math.max(max,dp[j]+1);
}
}
dp[i] = max;
res = Math.max(res,max);
}
return res;
}
public static void main(String[] args) {
int[] nums = new int[]{10,9,2,5,3,7,101,18};
System.out.println(lengthOfLIS(nums));
}
}