求最长递增子序列

news2024/10/5 13:54:29

题目:

给定数组arr,返回arr的最长递增子序列

举例:

arr = [2,1,5,3,6,4,8,9,7]  返回最长递增子序列为 [1,3,4,8,9]

方法一:复杂度为O(N^2)

1. 生成长度为N的数组 dp,dp[i] 表示以arr[i] 这个数结尾的情况下,arr[0..i] 中最大递增子序列的长度

代码:

    public static int[] getdp1(int[] arr) {
        int[] dp = new int[arr.length];
        //从左向右依次算出每个位置的数结尾的情况
        for (int i = 0; i < arr.length; i++) {
            //当计算到i位置时,求以arr[i]结尾情况下的最长递增子序列长度,即dp[i]
            dp[i] = 1;
            //找 i 位置前面,所有比arr[i]小的数,这些数都与arr[i]是递增关系,找出那个最长的。
            for (int j = 0; j < i; j++) {
                if (arr[i] > arr[j]) {
                    dp[i] = Math.max(dp[i], dp[j]+1);
                }
            }
        }
        return dp;
    }

测试:

  

2. 根据dp数组得到最长递增子序列。

(1)遍历dp数组,找到最大值以及位置。

如上面的 dp 数组,最大值是5,位置是7。最终的最长递增子序列的长度为5,并且应该以arr[7]=9结尾。

(2)从arr数组的位置7,开始从右向左遍历。

如果对与某一个位置 i,既有 arr[i] < arr[7],又有dp[i] == dp[7] - 1,说明arr[i] 可以作为最长递增序列的倒数第二个数。

在上例 arr[6] < arr[7]  且 dp[6] = dp[7] -1 ,故arr[6]=8应该作为倒数第二个数

(3)从6位置开始,继续从右向左遍历,重复上面过程。

代码:

    public static int[] generateLIS(int[] arr, int[] dp) {
        int maxLen = 0;
        int index = 0;
        //找出dp数组中最大的那个数 和 下标index
        for (int i = 0; i < dp.length; i++) {
            if (dp[i] > maxLen) {
                maxLen = dp[i];
                index = i;
            }
        }
        //从上面得到最长子序列的长度为maxLen 初始化最长子序列
        int[] lis = new int[maxLen];
        //把index位置的数,放在最长递增子序列的末尾
        lis[--maxLen] = arr[index];
        //从index开始 从右向左遍历
        for (int i = index; i >= 0; i--) {
            if (arr[i] < arr[index] && dp[i]+1 == dp[index]){
                lis[--maxLen] = arr[i];
                //然后继续从i开始
                index = i;
            }
        }
        return lis;
    }

测试:

整个过程主方法:

    public static int[] lis1(int[] arr) {
        if (arr == null || arr.length == 0) {
            return null;
        }
        int[] dp = getdp1(arr);
        return generateLIS(arr, dp);
    }

 

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

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

相关文章

架构师必读 —— 逻辑模型(8)

利用框架整理信息 框架用于明确“整体结构”&#xff0c;也指“通过MECE分析法将整体构成要素进行大分类”。重要的是框架应是MECE分析框架&#xff0c;因为 一旦有遗漏和重复&#xff0c;就会导致混乱。整体构成要素可大致分为 3~7大类。 建议先确认目的后思考框架&#x…

实时单目追踪和稠密建图的算法框架:TANDEM算法

01 概述 最近在研究TANDEM算法&#xff0c;是一个实时单目追踪和稠密建图的算法框架。TANDEM的算法框架可以概括为如下的几个部分&#xff1a; 1、位姿计算----在关键帧实施基于滑窗的像素级集束优化&#xff1b; 2、追踪前端----实施直接稠密图片配准&#xff0c;基于全局模…

如何找回电脑回收站删除的文件, 10种恢复工具方法!

你想取回你的回收站删除的文件吗&#xff1f;无论是图像、视频还是文档&#xff0c;我们的设备都会存储所有内容。您可能不小心删除了数据&#xff0c;或者由于其他原因而消失了。要恢复您的文件&#xff0c;您可以访问技术人员或下载任何最好的文件恢复软件。 如果您选择第二…

怎样把电脑D盘合并到c盘?相邻的分区怎么合并到C盘

因为C盘是重要的系统盘&#xff0c;系统用户设置文件夹&#xff0c;包括各个用户的文档、收藏夹、上网浏览信息、配置文件&#xff0c;不能随意删除。如果C盘空间不足&#xff0c;就会影响到电脑的整体运行速率&#xff0c;会导致电脑卡顿&#xff0c;要想彻底地解决这种情况&a…

HTML期末作业课程设计期末大作业——电影网页制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

PHP序列化和反序列化漏洞学习

目录 PHP基础知识&#xff1a; 类的结构&#xff1a; 序列化 反序列化 魔术方法 字符串逃逸 PHP基础知识&#xff1a; 类的结构&#xff1a; 常见访问权限修饰符&#xff1a; public:公共的&#xff0c;在类的内部、子类中或者类的外部都可以使用&#xff0c;不受限制;p…

【GO】 K8s 管理系统项目[API部分--Daemonset]

K8s 管理系统项目[API部分–Daemonset] 1. 接口实现 service/dataselector.go // daemonCell type daemonSetCell appsv1.DaemonSetfunc(d daemonSetCell) GetCreation() time.Time {return d.CreationTimestamp.Time }func(d daemonSetCell) GetName() string {return d.Na…

高性能的Java IDE——IntelliJ IDEA v2022.3全新发布

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 I…

怎样在电脑上录制ppt课件?如何录制课件讲解视频

怎样在电脑上录制ppt课件&#xff1f;在当前的环境下&#xff0c;大部分学生都是在家进行上网课&#xff0c;本文就给大家分享几款非常简单实用的录制教学视频的工具。 一、PPT录屏 在windows系统中有个常用软件就是ppt&#xff0c;ppt也能够录屏&#xff0c;只是我们大家都忽…

postgresql数据库流复制

primary和standby在同一服务器的不同目录下。 primary: /var/postgre/data standby: /var/postgre/data1 1. 加账号 (也可以使用postgres账号) [postgresv-vlxsz-devdb01 data]$ psql psql (14.1) Type "help" for help. postgres# create role replica with r…

自动化制药设备中PLC如何进行远程监控?有何应用场景

随着科学技术水平的不断提高&#xff0c;制药设备也逐步走向自动化。自动化制药设备实现到精确的位置定位&#xff0c;实时的过程监控&#xff0c;快速的网络通讯&#xff0c;在到现场的每个动作的执行&#xff0c;具备高效率的生产特点。PLC作为现在工业设备控制系统的核心&am…

php-fpm 的状态查看和php-fpm 调优随笔

php-fpm status 配置 1. 找到php-fpm的配置文件&#xff0c;将 pm.status_path /status 注释去掉 重启php-fpm 2. 在nginx 中配置一个server块或者配置一个location 3. 最后通过curl 或者 http 请求可以看到php-fpm 的状态 可以带着参数访问&#xff0c;json、xml、html fu…

Android -- 每日一问:在项目中使用AsyncTask会有什么问题吗?

经典回答 那我们考查 AsyncTask 会问些什么呢&#xff1f;得先问问会不会用吧&#xff0c;看看知不知道有 onProgressUpdate 方法。 其次问一下是怎么理解 AsyncTask 的机制&#xff0c;有没有看过它的源代码&#xff1f; 这个问题主要看对方是否对 Android 的东西有好奇心&am…

夜天之书 #69 企业开源该选什么软件许可证?

开源软件和自由软件的概念与其许可证紧密绑定。通常&#xff0c;开源软件被定义为使用 OSI 认可的&#xff0c;即符合开源定义[1]的许可证来分发的软件&#xff0c;而自由软件被定义成使用 GPL 或说 Copyleft 式许可证分发的软件。尽管今天人们最关心的可能是软件的生产过程即如…

通过展开序列ISTA(SISTA)算法创建的递归神经网络(RNN)(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 递归神经网络&#xff08;recursive neural network&#xff09;是具有树状阶层结构且网络节点按其连接顺序对输入信息进行递归…

element表格去除border边框同时有竖直方向的边框

为什么要去除boder边框&#xff0c;原因是boder的边框与页面的背景色相同&#xff0c;然后显得表格内凹了一个像素 要实现的需求是表格去除border边框同时添加竖直方向的边框 但是如果不添加boder属性&#xff0c;表格则没有竖直方向的边框 这种下无内凹&#xff0c;但是显得…

ICV:上半年全球市场规模达20.4亿美元,超声波雷达仍具有竞争力!

全球前沿科技咨询机构ICV近期发布了全球车载超声波雷达的市场分析报告。ICV在报告中指出&#xff0c;在当前的自动驾驶发展阶段&#xff0c;超声波雷达在一众传感器中仍具有较强竞争力&#xff0c;其中APA类型超声波雷达的渗透率上升空间很大。2022年上半年中国的超声波雷达市场…

kettle - get请求

文章目录前言kettle - get请求前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! kettle - get请…

学Python爬虫好找工作吗?要学到什么程度?

Python的火爆&#xff0c;同时也带动了Python爬虫岗位的的极大需求。可能有些人想问了&#xff0c;学Python爬虫真的好找工作吗&#xff1f;要学到什么程度&#xff1f;根据各大招聘网站的数据反馈&#xff0c;目前市场上对Python爬虫工程师的需求比较大。但是这并不意味着学习…

【Redis技术专题】「高可用技术基础」一同分析一下Redis高可用的“基石”之主从架构的本质原理解析

&#x1f4d5;技术箴言 当心中有更高的山峰去攀登&#xff0c;就不会在意脚下的泥沼。 &#x1f4d5;前提概要 Redis高可用的方案包括&#xff1a;持久化、主从复制&#xff08;及读写分离&#xff09;、哨兵和集群&#xff08;Cluster&#xff09;。 &#x1f4d5;&#x1f…