目录
题目描述
思路
以[10,9,2,5,3,7,101,18]为例 抛开代码不谈,我们找最长递增子序列的思路是发现先选10,或9后那么
2,5,7 或2,3,7就不能选了所以我们可以返回直接跳过10,9但计算机很难实现这样的思路即从前往后比较添加递增序列突然发现后面有一段递增序列但由于前面数的限制而不能添加,再回到前面把那个限制添加的数去掉。这样对序列又会产生很多变化,用这样的思路解决这个问题往往过于杂
线性dp的解题思路
线性dp的题就先定义dp的数组dp[] 然后明确数组以及数组下标代表的含义
dp[i]表示以nums[i]为结尾的递增子序列的最大个数
将dp[i]全部都等于1 如果给的数组里的数均不递增难么递增子序列的长度便为1
从i=1开始遍历
i->[1,nums.length) j->[0,i) 让nums[i]与nums[j]进行比较如果nums[i]>nums[j]那就说明nunms[i]可以加在nums[j]后面形成新的序列,新增的序列的长度为nums[j]+1 然后让 求出dp[i]的转移方程
dp[i]=max(dp[i],dp[j]+1)
class Solution {
public int lengthOfLIS(int[] nums) {
int len = nums.length;
int[] dp = new int[len];//dp[i]记录以nums[i]结尾的最长递增子序列
Arrays.fill(dp,1);
int maxLength=1;
for(int i=1;i<len;i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
dp[i]=Math.max(dp[i],dp[j]+1);
}
}
maxLength=Math.max(maxLength,dp[i]);
}
return maxLength;
}
}