LeetCode/最大递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
1. 动态规划
dp[i]表示以i结尾的最长长度
状态转移方程dp[i] = max(dp[j])+1 if num[j]
边界条件 dp[0] = 1
时间复杂度为O(n2),即遍历一遍,同时对每个元素往前搜索一遍
动态规划
class Solution {
public:
int lengthOfLIS(vector& nums) {
//动态规划
int n = nums.size();
if(n==0) return 0;
vector dp(n); //dp[i]表示以i结尾的最长长度
int res = 0;
for(int i=0;i
2. 动态规划优化
注意到方法一反向搜索时,要找的是序列末位元素小于当前元素的最大序列长度
我们关心的只是某一序列长度的最小末尾元素,所以dp[i]可以表示为序列长度为i的最小末尾元素值
这样不仅能减少查找的数据量,还能使用二分法进行查找
class Solution {
public:
int lengthOfLIS(vector& nums) {
//动态规划
int n = nums.size();
if(n==0) return 0;
vector dp(n); //dp[i]记录i长度序列的最后元素值
int res = 0;
for(int k=0;k