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

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

牛客对应题目链接:最长上升子序列(二)_牛客题霸_牛客网 (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模型进行图像风格迁移实战(附源码和数据集)
1568 1
|
自然语言处理 算法 数据挖掘
自蒸馏:一种简单高效的优化方式
背景知识蒸馏(knowledge distillation)指的是将预训练好的教师模型的知识通过蒸馏的方式迁移至学生模型,一般来说,教师模型会比学生模型网络容量更大,模型结构更复杂。对于学生而言,主要增益信息来自于更强的模型产出的带有更多可信信息的soft_label。例如下右图中,两个“2”对应的hard_label都是一样的,即0-9分类中,仅“2”类别对应概率为1.0,而soft_label
自蒸馏:一种简单高效的优化方式
|
Python
【python】通过多线程解决tkinter gui中按键卡住的问题
【python】通过多线程解决tkinter gui中按键卡住的问题
636 0
|
NoSQL Redis 数据安全/隐私保护
在 Docker 中部署 Redis 并挂载配置文件
在 Docker 中部署 Redis 并挂载配置文件
|
6月前
|
安全 Go Windows
Goland 解决在windows上 Cannot run program “D:\atool\goexe\myApp.exe 无法进行正常调试问题
GoLand运行Go程序时遇“应用程序控制策略已阻止此文件”错误,主因是Windows安全机制拦截未签名的.exe。推荐两法:①右键属性→勾选“解除锁定”;②用gops关联已启动进程调试,彻底绕过拦截。(239字)
1125 4
Goland 解决在windows上 Cannot run program “D:\atool\goexe\myApp.exe 无法进行正常调试问题
|
6月前
|
安全 Cloud Native 数据安全/隐私保护
ServiceMesh 服务网格全解:Istio 核心原理拆解与云原生架构升级实战
本文深入解析ServiceMesh核心理念及Istio实践:剖析微服务治理痛点,详解Istio架构(istiod控制面+Envoy数据面)、xDS协议、流量拦截原理,并覆盖灰度发布、mTLS安全、熔断限流、可观测性等关键能力实战与生产最佳实践。
847 1
|
5月前
|
人工智能 安全 Java
OpenClaw 与飞书集成教程:企业IM对接全流程详解
本文详解OpenClaw与飞书集成全流程:涵盖飞书开放平台凭证获取(App ID/Secret)、OpenClaw后台配置及常见异常排查,步骤清晰、安全可靠,助力企业快速实现AI服务与IM办公无缝融合,提升协作效率。
|
11月前
|
人工智能 数据可视化 数据安全/隐私保护
AiPy定义智能财务分析,让数据说话!
看懂财报不只是看数据,更是读出背后的“故事”。以茅台2024年财报为例,AiPy智能分析揭示其高毛利、强净利与低负债背后的竞争优势,从高端酒战略到全链条效率,几分钟完成专业级洞察。
|
人工智能 自然语言处理 数据可视化
大模型+BI:一场关乎企业未来生死的数据智能卡位战 | 【瓴羊数据荟】数据MeetUp第四期
随着大模型技术突破,全球企业迎来数据智能革命。Gartner预测,到2027年,中国80%的企业将采用多模型生成式AI策略。然而,数据孤岛与高门槛仍阻碍价值释放。
954 9
大模型+BI:一场关乎企业未来生死的数据智能卡位战 | 【瓴羊数据荟】数据MeetUp第四期

热门文章

最新文章