leeetcode300 最长上升子序列(Java)
题目详情
题目解析
看到题目寻找最长上升子序列时,首先想到需要枚举所有子序列,但是这样直接枚举时间复杂度相对较高,因此,我们想到能不能利用动态规划进行求解。
根据动态规划的三个要素:
重叠子问题: 求解问题时要遍历数组,当前数组为 i 时,此时的最长子上升子序列与 i - 1 时有关,因此包含重叠子问题。
最优子结构: 最长子序列的长度存在,因此存在最优子结构
状态转移式: 假设dp[i] 表示以 nums[i] 为结尾的左侧子序列,
则 dp[i] = max(dp[j]) + 1 其中 0 <= j < i ;
因此代码可以写为:
/**
* 动态规划
* 时间复杂度 O(n^2)
* 空间复杂度 O(n)
*/
public class Solution {
public int lengthOfLIS(int[] nums){
int len = nums.length;
if(len < 2)
return len;
int[] dp = new int[nums.length];
dp[0] = 1;
int maxLen = 0;
for(int i = 1; i < nums.length; i ++){
int maxVal = 0;
for(int j = 0; j < i; j ++){
if(nums[i] > nums[j]){
maxVal = Math.max(maxVal, dp[j]);
}
}
dp[i] = maxVal + 1;
maxLen = Math.max(maxLen, dp[i]);
}
return maxLen;
}
}