题目:
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
class Solution {
/*
动态规划五部曲
* 1、确定 dp 数组以及下标的含义
* dp[i] 表示 包括 i 以及它前面的最长上升子序列
* 2、状态转移方程
* 位置 i 的最长升序子序列等于 j 从 0 到 i-1 各个位置的最长上升子序列 +1 的最大值
* 所以 if ( nums[i] > nums[j] ) { dp[i] = max(dp[i], dp[j] + 1); }
* **注意这里不是要 dp[i] 与 dp[j] + 1 进行比较,而是我们要取dp[j] + 1的最大值**
* 3、dp[i] 的初始化
* 每一个i ,对应的上升序列的长度至少为 1。
* 4、确定遍历顺序
* 一定是从前向后的啦~
* j 其实就是 0 - ( i- 1 ) 区间,遍历i 在外层,遍历 j 在内层。
*/
public:
int lengthOfLIS(vector<int>& nums)
{
// 这个判断不要忘记了哇~~
if(nums.size() <= 1)
{
return nums.size();
}
vector<int> dp(nums.size(), 1);
// i 是要将整个字符串都取完的,因此需要一个在中间过程中记录最大值的变量,该变量直接存储最大的值。
int result = 0;
for(int i = 1; i < nums.size(); ++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];
}
}
return result;
}
};