错误解法:在每次更新db[i]时,如果当前nums[i]>nums[i-1]就db[i-1]+1,否则db[i-1]
java
class Solution {
public int lengthOfLIS(int[] nums) {
int n = nums.length;
int[] db = new int[n]; // db[i]表示到i的最长严格递增子序列的长度
db[0] = 1;
for (int i = 1; i < n; i++) {
db[i] = nums[i-1]<nums[i]?db[i-1]+1:db[i-1];
}
return db[n-1];
}
}
错误原因:4<10 被记为1;后面3<8<9会在这个1上进行累加,但是10>3 8 9的,不正确

解法一:(动态规划)①定义:dp[i]表示以下标为i的字母结尾的最长严格递增子序列,dp[n] ②初始状态:dp[0]=1 ③状态转移方程:dp[i] = nums[j]<nums[i]?Math.max(db[j]+1,db[i]):1; max=Math.max(max,dp[i])(dp[i] = nums[i-1]<nums[i]?dp[i-1]+1:1❌没有考虑非连续性)
java
class Solution {
public int lengthOfLIS(int[] nums) {
// 定义:dp[i]表示以下标为i的字母结尾的最长严格递增子序列,dp[n]
// 初始状态:dp[0]=1
// 状态转移方程:dp[i] = nums[j]<nums[i]?Math.max(db[j]+1,db[i]):1; max=Math.max(max,dp[i])
// dp[i] = nums[i-1]<nums[i]?dp[i-1]+1:1❌没有考虑非连续性
int n = nums.length;
int[] db = new int[n]; // db[i]表示以i解为的最长严格递增子序列的长度
db[0] = 1;
int max = 1;
for (int i = 1; i < n; i++) {
db[i]=1; // db[i]最少包含它本身,赋值为1
for(int j = 0;j<i;j++){
if(nums[i]>nums[j]){
// nums[j]>nums[i]严格递增,可以取以i结尾的最长长度+1
db[i] = Math.max(db[j]+1,db[i]);
}
}
max = Math.max(max, db[i]);
}
// 返回的结果是最长递增子序列,而不是以i结尾的最长递增,不能返回db[n-1]
// 返回结果要在过程中记录
return max;
}
}
注意:
db[i]
表示以i为结尾的最长严格递增子序列的长度。- 返回的结果是最长递增子序列,而不是以i结尾的最长递增,不能返回
db[n-1]
。返回结果要在过程中记录。 dp[i]
可以直接表示题目要求,也可以表示另外的含义,辅助算出题目要求,eg:db[i]
表示以i
为结尾的最长严格递增子序列的长度