一、题目
力扣原题:https://leetcode-cn.com/problems/longest-increasing-subsequence/
二、动态规划
class Solution {
public int lengthOfLIS(int[] nums) {
if (null == nums || 0 == nums.length) {
return 0;
}
int[] dp = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
dp[i] = 1;
}
// 场景一:dp[i] = max(dp[j] + 1),其中j < i && nums[j] < nums[i]
// 场景二:不满足场景一,则dp[i] = 1
int maxLen = 1;
for (int i = 1; i < nums.length; i++) {
for (int j = i - 1; j >= 0; j--) {
// 不符合上升条件
if (nums[j] >= nums[i]) {
continue;
}
if (dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
maxLen = Math.max(maxLen, dp[i]);
}
}
}
return maxLen;
}
}
- 基本思路:分析题意,最长上升子序列可以复用到当前位置之前的子结果,因此自然可以想到动态规划,dp[i]记录i位置(含nums[i])的最长上升子序列。状态转移方程为dp[i] = max(dp[j] + 1),其中0<=j<i && nums[j] < nums[i]。
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)