数据结构学习 Leetcode300最长递增子序列

news2024/9/23 13:19:31

是我在学习动态规划时遇到的一道题。

题目:

一共有两种解法:

  1. 动态规划
  2. 贪心 二分(很难理解,我还没完全懂。。。)

 

解法一:动态规划

思路:

状态:nums的前i个数的最长递增子序列。dp[i]

转移方程:依次计算每个状态dp[i]的状态,这个状态依赖于前dp[0...i-1]的状态。

如果大于前面的数nums[j] < nums[i],则说明有递增现象了。起码nums[j] ,nums[i]是一对的,如果j前面还有子序列,那岂不是美哉,总之dp[i] = dp[j] + 1。但是别急,万一这个dp[j]小,赋值了反而dp[i]就变小了。我们要的是最长的,先要比较,再确定。

主要是为了防止这种情况:【3 4 5 6 0 1 2 7】

比如这个时候7已经和6比完了,7>6,所以dp[7]=dp[3]+1

然后又和0比,7>0,如果直接dp[7]=dp[4]+1,那么dp[7]就会变成2了。

 最后找到dp里最大的,就是我们想要的。

复杂度计算:

时间复杂度O(n^2)
空间复杂度O(n)

代码:

#include <vector>
//最长递增子序列
//解法一:动态规划
//时间复杂度O(n^2)
//空间复杂度O(n)
class Solution {
public:
    int lengthOfLIS(std::vector<int>& nums) {
        //状态就是前i个数最长递增子序列
        std::vector<int> dp(nums.size(), 1);//状态
        int max_count = 1;
        for (int i = 1; i < nums.size(); ++i)//一个一个状态算
        {
            //转移方程
            for (int j = 0; j < i ; ++j)//查询前面的数是否小于
            {
                if (nums[j] < nums[i])//如果大于前面的数,则说明有递增
                {
                    dp[i]=std::max(dp[i], dp[j] + 1);//有递增也不能直接赋值,有可能这个dp[j]小,赋值了反而dp[i]就变小了
                }
            }
            max_count = max_count > dp[i] ? max_count : dp[i];//取最大的dp[i]
        }
        return max_count;
    }
};

void Test_solution1()
{
    std::vector<int> nums{ 1,3,6,7,9,4,10,5,6 };
    Solution solution;
    std::cout<<solution.lengthOfLIS(nums);
}

 

 解法二:贪心 二分

思路:

二分就是用来查找的。关键是用贪心创建的dp[]是一个单调递增的,所以可以二分查找。

很难解释,因为我也一知半解。挖个坑!

复杂度计算: 

时间复杂度O(nlogn)
空间复杂度O(n)

代码:

#include <vector>
//最长递增子序列
//解法二:贪心 二分
//时间复杂度O(nlogn)
//空间复杂度O(n)
class Solution {
public:
    int lengthOfLIS(std::vector<int>& nums) {
        //dp[x]:长度为x的最长递增子序列的最小一个末尾值
        //举个例子{1,2,3,4,5,6} 
        // 长度为3的最长递增子序列有好几个,比如:{1,2,3} {3,4,5} {4,5,6},他们有各种末尾值,但是最小的一个末尾值是3
        std::vector<int> dp(nums.size(),0);//dp实际有多长(len),就意味着最长递增子序列有多长
        dp[0] = nums[0];
        int len = 0;//初始化,长度为1,指着dp第一个数dp[0]
        for (int i = 1; i < nums.size(); ++i)
        {
            if (nums[i] > dp[len])
            {
                ++len;
                dp[len] = nums[i];
            }
            else
            {
                int j = 0, z = len;
                while (j < z)
                {
                    int mid = (j + z) / 2;
                    if (dp[mid] < nums[i])j = mid + 1;
                    else z = mid;
                }
                dp[j] = nums[i];
            }
        }
        //for (const auto& x : dp)
        //{
        //    std::cout << x << ' ';
        //}
        //std::cout << std::endl;

        return len + 1;
    }
};

void Test_solution2()
{
    //std::vector<int> nums{ 1,3,6,7,9,4,10,5,6 };
    std::vector<int> nums{ 5,6,7,8,9,1,2,3,4 };
    Solution solution;
    std::cout << solution.lengthOfLIS(nums);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1324922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 正则表达式入门:轻松掌握字符串匹配的艺术

Python 正则表达式入门&#xff1a;轻松掌握字符串匹配的艺术 引言&#xff1a;什么是正则表达式&#xff1f;基础知识&#xff1a;正则表达式的语法和规则Python中的正则表达式&#xff1a;re模块的使用实战应用&#xff1a;常见的正则表达式案例最佳实践与常见错误结语&#…

uml用例图是什么?有哪些要素?

UML用例图是什么&#xff1f; UML用例图&#xff08;Unified Modeling Language Use Case Diagram&#xff09;是一种用于描述系统功能和用户之间交互的图形化建模工具。它是UML的一部分&#xff0c;主要用于识别和表示系统中的各个用例&#xff08;用户需求或功能点&#…

Axure中继器的使用实现表格的增删改查的自定义文件

目录 一.认识中继器 1.1.什么中继器 1.2. 中继器的组成 1.3.中继器的使用场景 二.中继器进行增删改查 三.十例表格增删改查 还有Axure这个东西许多东西需要我们去发现&#xff0c;我们需要去细心的研究&#xff0c;我们一起加油吧&#xff01;&#xff01;&#xff01;今…

Java如何开发PC客户端(Windows,Mac,Linux)

项目编译工具&#xff1a;Gradle开发工具&#xff1a; Idea开发语言&#xff1a; 建议java17以上ui组件&#xff1a;openjfx (org.openjfx.javafxplugin)打包工具: jpackage (org.beryx.jlink) 一、如何解决打包问题 java 14以后&#xff0c;有了jpackage工具&#xff0c;能够…

澳鹏干货解答!“关于机器学习的十大常见问题”

探索机器学习的常见问题&#xff0c;了解机器学习和人工智能的基本概念、原理、发展趋势、用途、方法和所需的数据要求从而发掘潜在的商机。 什么是机器学习&#xff1f; 机器学习即教授机器如何学习的过程&#xff0c;为机器提供指导&#xff0c;帮助它们自己开发逻辑&#…

108基于matlab的使用模拟退火 (SA) 求解并行机器调度的程序

基于matlab的使用模拟退火 &#xff08;SA&#xff09; 求解并行机器调度的程序&#xff0c;程序已调通&#xff0c;可直接运行。 108 matlab模拟退火 &#xff08;SA) (xiaohongshu.com)

Java实现限流算法

下面是一个使用Java实现的令牌桶算法的例子&#xff1a; import java.util.concurrent.atomic.AtomicLong;public class RateLimiter {private final long capacity; // 令牌桶容量private final long rate; // 令牌生成速率private AtomicLong tokens; // 当前令牌数量privat…

Python教程(16)——lambda函数介绍

目录 lambda函数介绍lambda函数语法lambda函数特性匿名性简洁性 在高阶函数中的应用 lambda函数介绍 我们平时经常可以在Python的代码中看到一种lambda开头的这种表达式&#xff0c;如果没有学过Python的相关知识&#xff0c;可能会一脸懵逼&#xff0c;不清楚到底这个关键字是…

unity2d 关闭全局重力

UNITY2D项目默认存在Y轴方向重力&#xff0c;创建俯视角2D场景时可通过以下配置关闭 Edit > Project Settings > Physics 2D > General Settings > Gravity 设置Y0

CUMT--Java--JDBC编程

目录 一、JDBC简介 二、数据库访问 1、加载数据库驱动 2、建立数据连接 3、创建Statement对象 4、执行SQL语句 5、访问结果集 三、MetaData接口 1、DatabaseMetaData接口 2、ResultSetMetaData接口 四、事务 1、JDBC中的事务 2、保存点 3、批量更新 一、JDBC简…

基于YOLOv8的草莓病害检测,加入EMA注意力和GPFN提升病害检测能力

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;基于YOLOv8的草莓病害检测&#xff0c;加入EMA注意力和GPFN性能分别从mAP0.5从原始的0.815提升至0.818和0.831 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。Y…

TensorFlow(2):Windows安装TensorFlow

1 安装python环境 这一步请自行安装&#xff0c;这边不做介绍。 2 安装anaconda 下载路径&#xff1a;Index of /&#xff0c;用户自行选择自己的需要的版本。 3 环境配置 3.1 anaconda环境配置 找到设置&#xff0c;点击系统->系统信息->高级系统设置->环境变量…

归一化和标准化(Z-Score)

在处理数据过程中&#xff0c;通常会有不同规格的数据&#xff0c;比如年龄的取值范围是0-130&#xff0c;收入的取值范围是0-100000等等&#xff0c;如果不进行归一化或标准化处理&#xff0c;梯度下降每次走过的相对长度就不一样&#xff0c;就导致某个参数很快就找到了最优解…

Android排队预约系统(Java+SqLite+ZXing)

自己写的排队预约系统&#xff0c;可改写&#xff0c;添加功能&#xff0c;如管理用户&#xff0c;查询排队人数等功能。(由于是选修课课设&#xff0c;所以写的比较粗糙) 使用方法&#xff1a; 1.使用Android studio导入项目。 2.使用gradle加载build.gradle.kts中的依赖。…

DC-6靶场

DC-6靶场下载&#xff1a; https://www.five86.com/downloads/DC-6.zip 下载后解压会有一个DC-3.ova文件&#xff0c;直接在vm虚拟机点击左上角打开-->文件-->选中这个.ova文件就能创建靶场&#xff0c;kali和靶机都调整至NAT模式&#xff0c;即可开始渗透 首先进行主…

MatGPT - 访问 OpenAI™ ChatGPT API 的 MATLAB® 应用程序

系列文章目录 前言 MatGPT 是一款 MATLAB 应用程序&#xff0c;可让您轻松访问 OpenAI 的 ChatGPT API。使用该应用程序&#xff0c;您可以加载特定用例的提示列表&#xff0c;并轻松参与对话。如果您是 ChatGPT 和提示工程方面的新手&#xff0c;MatGPT 不失为一个学习的好方…

模拟信号和数字信号的区别

模拟和数字信号是携带信息的信号类型。两种信号之间的主要区别在于模拟信号具有连续电信号&#xff0c;而数字信号具有非连续电信号。 模拟信号和数字信号之间的差异可以通过不同类型波的例子来观察。 什么是模拟信号(Analog Signals)&#xff1f; 许多系统使用模拟信号来传输…

跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

在裸机系统中&#xff0c;系统的主体就是 C P U CPU CPU按照预先设定的程序逻辑在 m a i n main main函数里面顺序执行的无限循环。在多任务系统中&#xff0c;根据功能的不同&#xff0c;把整个系统分割成一个个独立的&#xff0c;无限循环且不能返回的的函数&#xff0c;这个…

【C++题目速刷】二分查找

【C题目速刷】二分查找 一、二分查找1、题目链接2、解题3、代码 二、在排序数组中查找元素的第一个和最后一个位置1、题目链接2、解题3、代码4、算法模板 三、x的平方根1、解题链接2、解题3、代码 四、搜索插入位置1、题目链接2、解题3、代码 五、山脉数组的峰顶索引1、题目链接…

Python新闻文本分类系统的设计与实现:基于Flask、贝叶斯算法的B/S架构

Python新闻文本分类系统的设计与实现&#xff1a;基于Flask、贝叶斯算法的B/S架构 引言数据获取与处理数据分析与可视化文本分类模型结论 引言 在信息爆炸的时代&#xff0c;新闻数据的快速获取和准确分类变得尤为重要。本文将介绍一种基于Python语言、Flask技术、B/S架构以及…