【算法】最长递增子序列(三种解法)

法一:递归

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;
    }
};
相关推荐
w_zero_one2 小时前
递归算法(一)
java·开发语言·算法
风影同志783244 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG4 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
地平线开发者5 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法
京东云开发者5 小时前
从“会生成”到“能生产”:萤火虫 AIGC 平台的 AI Infra 实践
算法·aigc·产品
youshi66686 小时前
PID——算法改进
算法
一只不想敲代码的程序猿7 小时前
如何更高效地拆解问题?
算法
微尘hjx8 小时前
【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点
人工智能·算法·yolo·目标跟踪·视觉检测·ultralytics·deep-oc-sort
梦帮科技8 小时前
意识启发式量子隧穿退火算法用于全局优化 (CITA) 完整技术指南
网络·人工智能·算法·量子计算·模拟退火算法
一去不复返的通信er9 小时前
排序 + 双指针:力扣15三数之和
算法·leetcode