题意理解:
给你一个整数数组
nums
,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,
[3,6,2,7]
是数组[0,3,1,6,2,2,7]
的子序列。
这里的子序列:不连续的递增子序列,不要求连续,所以无法通过相邻比较解题
我们使用动态规划的思路进行解题,计算到每个位置,所含的最长子序列长度
解题思路:
(1)定义一维dp数组
dp[i]表示nums[i]为结尾,所获得的最长子序列长度
(2)初始化
每个位置dp[i]=1,最长一个元素
(3)递推公式
dp[i]=max(dp[j]+1,dp[i]) j<i
(4)遍历顺序
for(int i=1;i<n;i++)
for(int j=0;j<i;j++)
1.解题
public int lengthOfLIS(int[] nums) {
int[] dp=new int[nums.length];
Arrays.fill(dp,1);
for(int i=1;i<nums.length;i++){
for(int j=0;j<i;j++){
if(nums[j]<nums[i]){
dp[i]=Math.max(dp[i],dp[j]+1);
}
}
}
int max=0;
for(int i=0;i<nums.length;i++) max=Math.max(max,dp[i]);
return max;
}
2.分析
时间复杂度:O(n^2)
空间复杂度:O(n)