300. 最长递增子序列(动态规划+贪心)

news2024/12/24 8:19:59

文章目录

  • 前言
  • 动态规划
    • 题目解析
    • 算法原理
        • 1.状态表示
        • 2.状态转移方程
        • 3.初始化
        • 4.填表顺序
        • 5.返回值是什么
    • 代码实现
  • 贪心
    • 算法原理
    • 二分优化
    • 代码实现
  • 总结


前言

在本文章中,我们将要解决一下Leetcode中300. 最长递增子序列
在本道题目中,我们将会用动态规划和贪心两种策略分别来解决这道问题。

动态规划

题目解析

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

子序列:要求相对顺序一致,可以是不连续的
子数组: 顺序一致,必须是连续的

这也就说明了子数组其实是子序列的一部分
子序列可以有2^n个
子数组只有n^2个

注意:严格递增,不可以相等

算法原理

1.状态表示

列出dp表,dp表中值的含义是什么

以i位置为结尾,::::::

根据这道题,dp[ i ]:以i位置为结尾的,所有子序列中最长的递增子序列的个数

2.状态转移方程

dp[i]是什么

🌟i位置的值要末是自己组成一个最长递增子序列,要摸和前面的结合一起构成最长递增子序列。
🌟如果是自己构成子序列,dp[ i ]就是1;
🌟如果是与前面的结合,那就复杂了。
因为你不知道前面那麽多dp值,哪个和你结合才是最大的,同时要满足是递增的。
nums[ i ]可以跟在前面任何一个数后面形成子序列。
🌟我们在【0,i-1】区间内找到最大的dp值就可以,同时满足递增

dp[ i ]=max(dp[ j ]+1,dp[ i ])

3.初始化

我们可以全部初始化为0,在填表时,判断两种情况哪个大。
我们也可以按照最坏的情况填表,每个元素都是一个递增子序列,也就是初始化为1,
我们在进行填表时,就只需要关注第二种情况就可以了,自动进行判断。
填表时只需要从第二个位置开始就可以。

4.填表顺序

题目很明显就可以知道,从左向右进行填表

5.返回值是什么

我们再来看一下dp表的含义,所有子序列中最长的递增子序列的个数,所有我们需要在dp表中找最大值。
我们不用吧dp表填完之后,在进行寻找,我们可以一直填表一直寻找最长长度。

代码实现

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) 
    {
        int n=nums.size();
        vector<int>dp(n,1);
        int maxdp=1;
        for(int i=1;i<n;i++)
        {
            int j=0;
            for(j=0;j<i;j++)
            {
                if(nums[i]>nums[j])
                {
                    dp[i]=max(dp[i],dp[j]+1);
                }
            }
            maxdp=max(dp[i],maxdp);
        }
        return maxdp;
    }
};

时间复杂度为O(N^2),空间复杂度为O(N)

贪心

我们在介绍贪心解的时候,先回顾一下动态规划的解法。
我们在考虑最长递增子序列的长度的时候,我们并不关心这个序列是什么样子的,我们只关心最后一个元素是谁

算法原理

我们以【7,3,8,4,7,2,14,13】这组数据为例子分析一下。

🌟 我们遍历数组内容,首先是7,我们可以得到以下结论:长度为1的子序列为7
🌟 我们继续遍历,为3,3这个元素可以自己成为一个子序列,也可以与前面结合形成一个子序列,但是我们要求是递增的,这种条件并不满足,只能自己形成一个子序列。
🌟 这时,我们发现长度为1的子序列有两个了,一个为3,一个为7。贪心来了,贪心就是每一步都选择当前看起来最优的解法

所有可以跟在7,后边的元素都可以跟在3后边。

那么我们在继续便利的时候,就不需要管7这个元素了,只需要与3进行判断就可以。

🌟 继续遍历到8,8这个元素也有两种选择,自己形成一个子序列,或者与前面的结合形成一个子序列。贪心来了,贪心就是每一步都选择当前看起来最优的解法。

8是大于3的,说明可以跟在3后面,形成长度为2的子序列,这才是我们当前的最优解

🌟 继续遍历到4,4这个元素也有两种选择,自己形成一个子序列,或者与前面的结合形成一个子序列。
我们发现4这个元素是大于3这个元素元素的,所以可以跟在3后面,长度为2的最后一个元素为8,是不能跟在这个元素的后面的。这时长度为2的子序列就有两种,【3,8】,【3,4】.很显然【3,4】是更优的,为什莫呢???
因为所有可以跟在8后面的都可以跟在4后边。
所有我们之后进行判断的时候,就不用管8这个元素了。只需要关心4这个元素。
🌟 后面也是同样的道理…

我们直接来看遍历完样子
在这里插入图片描述

我们通过上帝视角发现这并不是我们子序列的样子,正常应该是【3,4,7,14】或者【3,4,7,13】。我们只要求长度就可以。

我们回想一下贪心的介绍,我们只介绍对的方法,至于为什莫对,我们不关心,当作经验吸收

我们再来总结一下贪心的地方

1.存什么:所有长度为x的递增子序列中,最后一个元素的最小值。
2.存哪里:所有大于等于nums[ i ]的最小值的位置。

分析一下时间复杂度:我们要遍历一遍,便利的同时遍历一下存放位置,时间复杂度为O(N^2);

二分优化

我们可以用二分算法优化时间复杂度。

因为我们存放的数据都是按照有序存放的,我们可以用二分查找算法快速找到对应的位置,就可以把使时间复杂度优化到O(N*logN)

代码实现

class Solution
{

public:
    int lengthOfLIS(vector<int>& nums)
    {
        int n = nums.size();
        vector<int> ret;
        ret.push_back(nums[0]);
        for (int i = 1; i < n; i++)
        {
            if (nums[i] > ret.back()) // 如果能接在最后⼀个元素后⾯,直接放
            {
                ret.push_back(nums[i]);
            }
            else
            {
                // ⼆分插⼊位置
                int left = 0, right = ret.size() - 1;
                while (left < right)
                {
                    int mid = (left + right) >> 1;
                    if (ret[mid] < nums[i]) left = mid + 1;
                    else right = mid;
                }
                ret[left] = nums[i]; // 放在 left 位置上
            }
        }
        return ret.size();
    }
};

总结

以上就是我们对Leetcode中最长递增子序列详细介绍,希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~

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

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

相关文章

光伏远动通讯屏的组成

光伏远动通讯屏的组成 远动通讯屏主要用于电力系统数据采集与转发&#xff0c;远动通讯屏能够采集站内的各种数据&#xff0c;如模拟量、开关量和数字量等&#xff0c;并通过远动通讯规约将必要的数据上传至集控站或调度系统。这包括但不限于主变和输电线路的功率、电流、电压等…

Hydroxyethyl-PEG-Hydroxyethyl,Hy-PEG-Hy是一种由聚乙二醇(PEG)和二酰肼单元构成的嵌段共聚物

【试剂详情】 英文名称 Hydroxyethyl-PEG-Hydroxyethyl&#xff0c;Hy-PEG-Hy 中文名称 聚乙二醇二酰肼&#xff0c;酰肼 PEG 酰肼 外观性状 由分子量决定&#xff0c;固体或者液体。 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k&#xff0c;3.4k&#xf…

进行交直流充电桩检测的步骤和规范

交直流充电桩检测是为了保证充电桩的安全、稳定和高效运行&#xff0c;对充电桩的各项性能进行检测的过程。以下是进行交直流充电桩检测的步骤和规范&#xff1a; 1. 准备工作&#xff1a;在进行充电桩检测之前&#xff0c;需要准备好相关的检测设备和工具&#xff0c;如电压表…

高端文档透明加密软件大盘点 | 透明无感知加密,高效安全

​在当今数字化时代&#xff0c;数据的安全性和保密性越来越受到重视。为了保护企业的重要文档和个人隐私数据&#xff0c;文档透明加密软件应运而生。这类软件采用先进的加密技术&#xff0c;能够在不影响用户正常操作的前提下&#xff0c;对文件进行透明无感知的加密和解密&a…

猫头虎分享已解决Bug || Node.js安装失败Error: unable to connect to https://nodejs.org/猫头虎

猫头虎分享已解决Bug || Node.js安装失败Error: unable to connect to https://nodejs.org/猫头虎 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — …

Linux——mysql运维篇

回顾基本语句&#xff1a; 数据定义语言 ( DDL ) 。这类语言用于定义和修改数据库的结构&#xff0c;包括创建、删除和修改数据库、表、视图和索引等对象。主要的语句关键字包括 CREATE 、 DROP 、 ALTER 、 RENAME 、 TRUNCATE 等。 create database 数据库 &…

java将图片转为pdf

效果图 直接上代码 1.引入jar <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version></dependency> 2.测试类 package pers.wwz.study.img2pdf20240507;import org.a…

无预警!奇安信网站卫士宣布停止服务,又一免费CDN消失?

百度云加速和奇安信网站卫士停止服务&#xff0c;国内免费CDN或将落幕 2024年4月29日&#xff0c;奇安信网站卫士官网发布停止服务公告&#xff0c; 到6月30日0点&#xff0c;将全面停止服务。用户仍有约2个月的时间进行迁移操作。 网站卫士是北京奇安信科技有限公司推出的免…

从互联网医院源码到搭建:开发视频问诊小程序的技术解析

如今&#xff0c;视频问诊小程序作为医疗服务的一种新形式&#xff0c;正逐渐受到人们的关注和青睐。今天&#xff0c;小编将为您详解视频问诊小程序的开发流程。 一、背景介绍 互联网医院源码是视频问诊小程序开发的基础&#xff0c;它提供了一套完整的医疗服务系统框架&…

【求助】鸿蒙DevEco Studio 4.1 Release-模拟器启动方式错误

软件版本&#xff1a;DevEco Studio 4.1 Release 报错提示&#xff1a; 没有权限查看处理指导 Size on Disk 显示1.0MB 尝试方案&#xff08;统统无效&#xff09;&#xff1a; 1、“windows虚拟机监控程序平台”、"虚拟机平台"已开启 启用CPU虚拟化 2、CPU虚…

基于svm的手写数字识别程序介绍(matlab)

1、程序界面介绍 该程序GUI界面包括手写板、手写数字可视化&#xff08;原图&#xff09;、对图像进行灰度处理&#xff08;灰度图&#xff09;、图像二值化处理&#xff08;二值化&#xff09;、图像特征可视化&#xff08;HOG特征&#xff08;方向梯度直方图&#xff09;&…

Python专题:三、数字和运算(1)

目录 一、Python中的数字和数值类型 二、整数进制的几种表示方式 三、变量 一、Python中的数字和数值类型 1、int 整数 如6,7&#xff0c;-1,0,42 2、float 浮点数 1.0&#xff0c;-2.2 3、complex 复数 11j&#xff0c;12j 4、type()查看数据类型 class 类 int 型 5…

推荐5个AI工具平替GPT

随着AI技术的快速发展&#xff0c;AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头&#xff0c;国内很多小伙伴往往望而却步&#xff0c;究其原因&#xff0c;就是它的使用门槛高&#xff0c;还有成本的考量。 不过&#xff0c;随着GPT技术的火热&#xff0c;国内也涌…

一个好用的短链接都需要具备哪些功能?

大家好&#xff0c;今天我们将会来聊聊一款优秀的短链接&#xff0c;都需要具备的功能&#xff0c;看看是不是你想要的呢&#xff1f; 1. 能够支持自定义域名 现在越来越多的用户都不会选择公用域名了&#xff0c;因为那样风险太大&#xff0c;而会选择用一个他们自己的专用域…

任务管理系统是什么?功能、特点、价值分析

任务管理系统是一种高效的项目管理工具&#xff0c;旨在帮助团队或个人有效组织、分配和追踪任务进度。它具有任务规划和分配、进度追踪、以及团队协作等功能。不仅确保每个成员都能明确自己的任务职责&#xff0c;管理者也能实时掌握项目整体进度。通过任务管理系统&#xff0…

【LeetCode算法】242. 有效的字母异位词

提示&#xff1a;此文章仅作为本人记录日常学习使用&#xff0c;若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、题目二、思路三、解决方案 一、题目 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每…

如何描述自己的算法?

算法的表达 好的&#xff0c;让我们来一起探讨如何向别人介绍我们的算法。说话很简单&#xff0c;但要把话说清楚&#xff0c;说明白就不那么容易了。同样的道理&#xff0c;能够通俗易懂&#xff0c;直观清晰和严谨地描述一个算法&#xff0c;也是一项具有挑战性的任务。接下…

Spring Gateway的核心功能:路由、过滤、限流一网打尽

Spring Gateway的简介 在微服务架构的世界里&#xff0c;如同繁星点点的服务需要一个指挥家&#xff0c;将它们有序地组织起来&#xff0c;让它们能够和谐地协同工作。这个指挥家&#xff0c;就是Spring Gateway。它是一个基于Spring Framework 5、Project Reactor和Spring Bo…

气膜体育馆可容纳多大的范围?—轻空间

气膜体育馆是一种创新的建筑形式&#xff0c;其可容纳的范围因其特殊的结构设计而具有灵活性和广泛性。那么&#xff0c;气膜体育馆到底可以容纳多大的范围呢&#xff1f; 首先&#xff0c;气膜体育馆的设计和建造通常可以根据场地的需求进行量身定制。由于气膜结构不需要钢结构…

轻松搞定!png格式图片怎么弄?详细方法一网打尽

在数字图像处理的日常应用中&#xff0c;PNG格式因其高质量的图像和支持透明背景的特性而备受青睐。然而&#xff0c;对于一些刚刚接触这一格式的用户&#xff0c;或者在处理PNG图片时遇到一些挑战的用户来说&#xff0c;如何轻松而有效地处理这种格式的图像可能是个问题。png格…