【最长递增子序列】【LeetCode算法】【c++】【动态规划】
文章目录
- LeetCode 300题 最长递增子序列
- 题目要求
- 思路
- 图示
- 代码
- 测试结果
- 如果有误还请各位大佬指正
LeetCode 300题 最长递增子序列
题目要求
给你一个整数数组 nums
,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]
是数组 [0,3,1,6,2,2,7]
的子序列。
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:
输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:
输入:nums = [7,7,7,7,7,7,7]
输出:1
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
思路
首先这道题目用到了动态规划的思想,是经典的动态规划题目
我们可以选择遍历数组的同时,用dp数组来记录每个数字包括自己在内递增序列中数字的个数,假如序列为【1,3,2,4】,那么dp数组中应该是【1,2,2,3】,下面通过图示进一步解释。
图示
下面我画出了几步帮助理解
用到了两层for循环,双指针,i指针一直进行++操作,j指针每次从第一个元素开始和a[i]进行比较,如果a[i]大于a[j],那么dp[i]进行更新,最后找出dp数组中最大值即可。
代码
// 最长上升子序列
#include <iostream>
using namespace std;
const int N = 1000;
int a[N], dp[N];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
int ans = 0;
for (int i = 0; i < n; i++)
{
dp[i] = 1;
for (int j = 0; j < i; j++)
{
if (a[i] > a[j])
{
dp[i] = max(dp[i], dp[j] + 1);
}
}
ans = max(ans, dp[i]);
}
cout << ans << endl;
system("pause");
return 0;
}