最长递增子序列
学习记录自代码随想录
要点:1.dp数组含义:dp[i]代表以nums[i]结尾的最长递增子序列的长度;
2.递推公式:
f
o
r
(
j
=
0
:
i
)
i
f
(
n
u
m
s
[
i
]
>
n
u
m
s
[
j
]
)
d
p
[
i
]
=
m
a
x
(
d
p
[
i
]
,
d
p
[
j
]
+
1
)
for(j = 0 : i) if(nums[i]>nums[j]) dp[i] = max(dp[i], dp[j]+1)
for(j=0:i)if(nums[i]>nums[j])dp[i]=max(dp[i],dp[j]+1);
3. 返回不能直接返回dp[n-1],因为此时dp[n-1]代表的是以nums[n-1]结尾的最大递增子序列的长度,所以此时要返回dp数组的最大值;
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
// 1.dp[i]含义为以nums[i]结尾的递增子序列的最大长度
vector<int> dp(n, 1);
// 2.递推公式:for(j = 0 : i) if(nums[i] > nums[j]) dp[i] = max(dp[i], dp[j]+1)
// 3.dp数组初始化:每一个nums[i]结尾对应的dp[i]序列长度最少为1;
// dp[0] = 1;
// 4.遍历顺序:正向遍历
int result = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < i; j++){
if(nums[i] > nums[j]) dp[i] = max(dp[i], dp[j]+1);
}
if(dp[i] > result) result = dp[i];
}
// 5.举例推导dp数组
// 注意此时不能直接返回dp[n-1],因为dp[n-1]代表的是以nums[n-1]结尾的最长递增子序列的长度,不是所有的最长递增子序列
// return dp[n-1];
return result;
}
};