
法一:递归
cpp
class Solution {
public:
int lengthOfLIS(vector<int>& nums)
{
int ret=0;
for(int i=0;i<nums.size();i++)
{
int len=dfs(nums,i);
ret=max(ret,len);
}
return ret;
}
int dfs(vector<int>& nums,int pos)
{
int ret=1;
for(int i=pos+1;i<nums.size();i++)
{
if(nums[i]>nums[pos])
{
ret=max(ret,1+dfs(nums,i));
}
}
return ret;
}
};
此方法时间复杂度过于大,所以会超出时间限制,在此基础上可用记忆化搜索进行优化。
法二:记忆化搜索
cpp
class Solution {
public:
int lengthOfLIS(vector<int>& nums)
{
int n=nums.size();
vector<int> memo(n,0);
int ret=0;
for(int i=0;i<nums.size();i++)
{
int len=dfs(nums,i,memo);
ret=max(ret,len);
}
return ret;
}
int dfs(vector<int>& nums,int pos,vector<int>& memo)
{
if(memo[pos])
{
return memo[pos];
}
int ret=1;
for(int i=pos+1;i<nums.size();i++)
{
if(nums[i]>nums[pos])
{
ret=max(ret,1+dfs(nums,i,memo));
}
}
memo[pos]=ret;
return ret;
}
};
法三:动态规划
cpp
class Solution {
public:
int lengthOfLIS(vector<int>& nums)
{
int n=nums.size();
int ret=0;
vector<int> dp(n,1);
for(int i=n-1;i>=0;i--)
{
for(int j=i+1;j<n;j++)
{
if(nums[j]>nums[i])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
ret=max(ret,dp[i]);
}
return ret;
}
};