题目分析一
这个题目有两种解法,我们先来讨论最常见的动态规划的解法,我们用dp[i]表示i位置下最长的子序列的长度,那么在已知dp[0…i-1]的前提下,只要遍历前面的数组,找到num[i]>num[k] and max{dp[k]+1,dp[i]},k属于[0,i).用公式表示如下:
d
p
[
i
]
=
m
a
x
(
d
p
[
k
]
+
1
,
d
p
[
i
]
)
,
k
∈
[
0
,
i
)
&
n
u
m
[
k
]
<
n
u
m
[
i
]
dp[i] = max(dp[k]+1,dp[i]),k\in[0,i) \&num[k]<num[i]
dp[i]=max(dp[k]+1,dp[i]),k∈[0,i)&num[k]<num[i]
记得初始化dp[i]=1
java代码
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
for(int i=0;i<dp.length;i++){
dp[i] = 1;
for(int j=0;j<i;j++){
if(nums[j]<nums[i] && dp[j]+1>dp[i]){
dp[i] = dp[j] + 1;
}
}
}
int ret = 0;
for(int i=0;i<dp.length;i++){
if(ret<dp[i]){
ret = dp[i];
}
}
return ret;
}