【错题集-编程题】最长上升子序列(二)(贪心 + 二分)

简介: 【错题集-编程题】最长上升子序列(二)(贪心 + 二分)

牛客对应题目链接:最长上升子序列(二)_牛客题霸_牛客网 (nowcoder.com)

力扣对应题目链接:300. 最长递增子序列 - 力扣(LeetCode)


一、分析题目

1、贪心 + 二分

在考虑最长递增子序列的长度的时候,其实并不关心这个序列长什么样子,我们只是关心最后⼀个元素是谁。这样新来⼀个元素之后,我们就可以判断是否可以拼接到它的后面。

因此,我们可以创建⼀个数组,统计长度为 x 的递增子序列中,最后一个元素是谁。为了尽可能的让这个序列更长,我们仅需统计长度为 x 的所有递增序列中最后一个元素的最小值。统计的过程中发现,数组中的数呈现递增趋势,因此可以使用二来查找插入位置。


2、动态规划

(1)dp[i] 的定义

表示 i 之前包括 i 的以 nums[i] 结尾的最长递增子序列的长度。


(2)状态转移方程

if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);


(3)初始化

每一个 i 对应的 dp[i](即最长递增子序列)起始大小至少都是 1。

(4)遍历顺序

从前往后遍历。


二、代码

1、贪心 + 二分(推荐)

//值得学习的代码
//O(NlogN)
class Solution
{
    int dp[100010] = { 0 }; // dp[i] 表⽰:⻓度为 i 的最⼩末尾
    int pos = 0;
 
public:
    int LIS(vector<int>& a) 
    {
        for(auto x : a)
        {
            // 查找 x 应该放在哪个位置
            if(pos == 0 || x > dp[pos])
            {
                dp[++pos] = x;
            }
            else
            {
                // ⼆分查找插⼊位置
                int l = 1, r = pos;
                while(l < r)
                {
                    int mid = (l + r) / 2;
                    if(dp[mid] >= x) r = mid;
                    else l = mid + 1;
                }
                dp[l] = x;
            }
        }
        return pos;
    }
};

2、动态规划

//力扣AC代码
//从前往后遍历(推荐)
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n=nums.size();
        if(n<=1) return n;
        vector<int> dp(n, 1);
        int res=0;
        for(int i=1; i<n; i++)
        {
            for(int j=0; j<i; j++)
            {
                if(nums[j]<nums[i])
                    dp[i]=max(dp[i], dp[j]+1);
            }
            if(dp[i]>res)
                res=dp[i];
        }
        return res;
    }
};
 
//从后往前遍历
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n=nums.size();
        vector<int> dp(n, 1);
        int res=0;
        for(int i=n-1; i>=0; i--)
        {
            for(int j=i+1; j<n; j++)
            {
                if(nums[i]<nums[j])
                    dp[i]=max(dp[i], dp[j]+1);
            }
            res=max(res, dp[i]);
        }
        return res;
    }
};
 
//记忆化搜索
class Solution {
public:
    int dfs(int pos, vector<int>& nums, vector<int>& memo)
    {
        if(memo[pos]!=0) return memo[pos];
        int ans=1;
        for(int i=pos+1; i<nums.size(); i++)
        {
            if(nums[i]>nums[pos])
                ans=max(ans, dfs(i, nums, memo)+1);
        }
        memo[pos]=ans;
        return ans;
    }
    int lengthOfLIS(vector<int>& nums) {
        int n=nums.size();
        vector<int> memo(n);
        int res=0;
        for(int i=0; i<n; i++)
            res=max(res, dfs(i, nums, memo));
        return res;
    }
};

三、反思与改进

这道题我是想用动态规划来做的,但也没做出来,不过这里用不了动态规划,会超时,如果数据量小的话可以使用。贪心 + 二分这种思路没想到,但这种解法才比较具有普遍性,不需要过多考虑数据量的问题(感觉这种题得多做几次才会有思路)。


相关文章
|
数据可视化 PyTorch 算法框架/工具
使用PyTorch搭建VGG模型进行图像风格迁移实战(附源码和数据集)
使用PyTorch搭建VGG模型进行图像风格迁移实战(附源码和数据集)
1344 1
|
12月前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
3267 1
|
机器学习/深度学习 网络协议 PyTorch
【文献学习】DCCRN: Deep Complex Convolution Recurrent Network for Phase-Aware Speech Enhancement
本文介绍了一种新的深度复数卷积递归网络(DCCRN),用于处理语音增强问题,特别是针对低模型复杂度的实时处理。
1012 5
|
运维 网络安全
解决ssh: connect to host IP port 22: Connection timed out报错(scp传文件指定端口)
通过这些步骤和方法,您可以有效解决“ssh: connect to host IP port 22: Connection timed out”问题,并顺利使用 `scp`命令传输文件。
13108 7
|
监控 算法
贪心算法-题型讲解
贪心算法-题型讲解
327 0
贪心算法-题型讲解
|
10天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
6天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
3944 11
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
7天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
4545 14
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
9天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
7082 15