动态规划-子序列问题1

文章目录

  • 1. 最长递增子序列(300)
  • 2. 摆动序列(376)
  • 3. 最长递增子序列的个数(673)
  • 4. 最长数对链(646)


1. 最长递增子序列(300)

题目描述:
在这里插入图片描述

状态表示:
根据经验以及题目要求,设置dp数组,dp[i]表示以i位置为结尾的子序列的最长长度。
状态转移方程:
这里因为涉及到序列的概念,要想获得dp[i]的值,首先需要遍历i位置之前的数组,如果数值小于i位置的数值,那么dp[i]的值就是该位置的dp数组值加一,最终dp[i]的值就是这些值中的最大值。状态转移方程可以归结为在nums[i]>nums[j]时,dp[i]=max(dp[i],dp[j]+1),这里的j取值是0到i-1,具体看代码。
初始化:
初始化直接将dp数组中的所有值都赋为1即可,因为以每个位置为结尾的递增子序列的长度是至少为1的。
填表顺序:
从左至右。
返回值:
返回dp数组最大值。
代码如下:

class Solution {public int lengthOfLIS(int[] nums) {int n = nums.length;int[] dp = new int[n];for (int i = 0; i < n; i++) {dp[i] = 1;}int max = dp[0];for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}max = Math.max(max, dp[i]);}return max;}
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N)

2. 摆动序列(376)

题目描述:
在这里插入图片描述

动态表示:
设置两个数组f和g,分别代表i位置的数大于上一个位置的数值以及i位置的数值小于上一个位置的数值。
动态转移方程:
这里跟子数组问题中的最长湍流数组问题是一个道理,不过在搜索前一个数值的时候要加一个循环遍历i位置之前的数值,因为这里是序列问题,而不是数组问题。当i位置数值大于上一个数值时,f[i]=g[j]+1,当i位置数值小于上一个数值时,g[i]=f[j]+1。
初始化:
初始化的话,因为单个数值就可以构成长度为1的摆动序列,所以可以直接将f和g数组直接全部初始化1。
填表顺序:
从左至右。
返回值:
返回数组g和f中的最大值。
代码如下:

class Solution {public int wiggleMaxLength(int[] nums) {int n = nums.length;int[] f = new int[n];int[] g = new int[n];for (int i = 0; i < n; i++) {f[i] = 1;g[i] = 1;}int max = 1;for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {f[i] = Math.max(f[i], g[j] + 1);} else if (nums[i] < nums[j]) {g[i] = Math.max(g[i], f[j] + 1);}}max = Math.max(Math.max(g[i], f[i]), max);}return max;}
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N)

3. 最长递增子序列的个数(673)

题目描述:
在这里插入图片描述

状态表示:
这题比较特殊,分别设置两个数组count[i]以及len[i]分别表示以i位置元素为结尾的子序列的最长严格递增子序列的个数以及最长严格递增子序列的长度。
状态转移方程:
因为题目是要求序列严格递增,所以只考虑在num[i]>nums[j]时的情况,在此时如果len[j]+1>len[i]时,len[i]=len[j]+1,并且将count[i]赋为count[j],如果len[j]+1==len[i],那么len数组的值不变,但是count[i]+=count[j]。这个过程如果结合前面子序列题目的思想是很好理解的,具体看代码。
初始化:
因为本题考虑的是递增子序列,单独的一个数值元素即可构成序列,所以可以直接将count和len数组的全部元素先赋为1。
填表顺序:
从左至右。
返回值:
返回以i位置为结尾的最长递增子序列的count数组中i位置的值,但是要考虑一种情况就是len数组中可能会出现多个相同的最大值,这样就要把count数组中的对应的多个位置的值加起来,这个过程可以使用一个简单的贪心算法解决。
代码如下:


class Solution {public int findNumberOfLIS(int[] nums) {int n = nums.length;int[] len = new int[n];int[] count = new int[n];for (int i = 0; i < n; i++) {len[i] = 1;count[i] = 1;}for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {if (len[i] < len[j] + 1) {count[i] = count[j];len[i] = len[j] + 1;} else if (len[i] == len[j] + 1) {count[i] += count[j];}}}}int ret = count[0];int max = len[0];for (int i = 1; i < n; i++) {if (max < len[i]) {ret = count[i];max = len[i];} else if (max == len[i]) {ret += count[i];}}return ret;}}

题目链接

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

4. 最长数对链(646)

题目描述:
在这里插入图片描述

状态表示:
根据经验以及题目要求设置一个数组dp,使用dp[i]来表示以第i个位置的数对作为结尾的最长数对链的长度。
状态转移方程:
这里的状态转移方程和这篇博客介绍的第一题的思路一致,都是在遍历pairs这个主数组时再加上一个循环,但是题目给出一个额外的条件就是可以无视顺序,所以为了得到更长的递增子序列要去提前将pairs数组给排序好,因为排序的是数对,所以在使用Arrays中的静态方法sort的时候要设置一个lambda表达式来指定排序的规则。
初始化:
还是一样,先对dp数组中的每一个元素都赋为1。
填表顺序:
从左至右。
返回值:
返回dp数组中的最大值即可。
代码如下:

class Solution {public int findLongestChain(int[][] pairs) {int n = pairs.length;Arrays.sort(pairs, (o1, o2) -> {return o1[0] - o2[0];});int[] dp = new int[n];for (int i = 0; i < n; i++) {dp[i] = 1;}int max = dp[0];for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (pairs[i][0] > pairs[j][1]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}max = Math.max(max, dp[i]);}return max;}}

题目链接

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

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

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

相关文章

气血足不足主要看看两个部位这些补气血的调理方法帮到您

气血足不足&#xff0c;关键看这两处&#xff1a;1、观耳识气血&#xff1a;红润饱满&#xff0c;弹性十足&#xff0c;这便是气血旺盛的直观表现。然而&#xff0c;随着年龄的增长&#xff0c;许多人会发现耳朵逐渐松弛、出现皱纹&#xff0c;这往往暗示着气血的流失。这里有个…

电路邱关源学习笔记——3.5回路电流法

1.回路电流法 以基本回路中沿回路连续流动的假想电流为未知量列写电路方程分析电路的方法。它适用于平面和非平面电路。 列写的方程 回路电流法是对独立回路列写KVL方程&#xff0c;方程数为&#xff1a;b-n1 注意&#xff1a;与支路电流法相比&#xff0c;方程数减少了n-1个…

机器人操作系统ROS2学习—编译工作空间colcon build报错问题

在ROS2中&#xff0c;工作空间创建完成后&#xff0c;会经常需要编译工作空间。在工作空间dev_ws 下打开一个终端&#xff0c;通过指令Colcon build来编译工作空间。 1、这个过程有可能会出现如下错误: "colconbuild:Duplicate package names not supported" 根据…

实现堆的各种基本运算的算法(数据结构)

以小堆为例&#xff0c;大堆就举一反三了。 堆的物理结构就是普通的数组&#xff0c;但是逻辑结构看成了一颗完全二叉树。 小堆&#xff0c;就是树的每一个父节点都小于他的孩子节点。如图中第一排的a与b。大堆&#xff0c;就是树的每一个父节点都大于他的孩子节点。如图中第…

DBA-现在应该刚刚入门吧

说来话长 在2023年以前&#xff0c;我的DBA生涯都是“孤独的”。成长路径除了毕业前的实习期有人带&#xff0c;后续几乎都是靠自学。如何自学&#xff0c;看视频、看文档、网上查阅资料、项目实战。 可能是学疏才浅 &#xff0c;一直都是在中小公司混&#xff0c;在中小公司通…

为什么本国货币的贬值会导致本国物价的上涨

本国货币贬值意味着其对外国货币的汇率下降&#xff0c;也就是说&#xff0c;同样数量的本国货币现在能兑换的外国货币减少了。这种情况下&#xff0c;本国货币的购买力相对于外国货币减弱了。本国货币贬值可能导致本国物价上涨的几个原因&#xff1a; 进口成本上升&#xff1a…

德思特手持式频谱分析仪加速公共无线事业的运行

一、公共无线事业中无线电的重要性 提起无线电&#xff0c;许多人或许觉得这是非常老旧的观念。实际上&#xff0c;无线电在我们的生活中占据着非常重要的地位。当前&#xff0c;无线电早已成为受众最广泛的大众媒介。据工业和信息化部资料显示&#xff0c;全球95%的人口都可以…

【MATLAB源码-第195期】基于matlab的OFDM,UFMC,FBMC三种通信系统误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;正交频分复用&#xff09;、UFMC&#xff08;通用频率分割复用&#xff09;、FBMC&#xff08;滤波器组多载波&#xff09;是目前无线通信领域中使用较广的几种多载波调制技术。随着无线通信技术的飞速发展&…

STM32学习和实践笔记(23):PWM输出的配置

PWM可以看作是定时器功能中其中一个子功能&#xff0c;配置步骤与前面定时器的方式类似。相关库函数也同样在tim.c里。 3.PWM输出配置步骤 &#xff08;1&#xff09;使能定时器及端口时钟&#xff0c;并设置引脚复用器映射。 a) RCC_APB1PeriphClockCmd(RCC_APB1Pe…

举个栗子!Tableau 技巧(272):学做曲线面积图(Sigmoid area charts)

曲线面积图&#xff08;Sigmoid area charts&#xff09;是区域图的一种创新变形&#xff0c;呈现数据随时间变化的情况&#xff0c;也可用于对数据总值趋势的洞察。 如何在 Tableau 中具体实现呢&#xff1f;今天的栗子&#xff0c;一睹为快吧&#xff01; 本期《举个栗子》…

HTML学习笔记(二)

1.HTML图像 图像标签&#xff08;<img>)和源属性&#xff08;src&#xff09; HTML中&#xff0c;图像由<img>标签来定义&#xff0c;<img>是空标签&#xff0c;只包含属性&#xff0c;没有闭合标签。在页面上显示图像需要使用源属性&#xff08;src),src是指…

机器人系统ros2-开发实践03-监听节点的参数变化(C++)

背景&#xff1a; 通常&#xff0c;节点需要响应其自身参数或另一个节点参数的更改。 ParameterEventHandler 类可以轻松侦听参数更改&#xff0c;以便您的代码可以响应它们。本教程将向您展示如何使用 ParameterEventHandler 类的 C 版本来监视节点自身参数的更改以及另一个节…

Linux系统安全与应用【一】

目录 1.账号安全控制 1.1 系统账号清理 1.2 密码安全控制 1.3 命令历史限制 1.4 命令总结 2.系统引导和登录控制 2.1 使用su命令切换用户 2.2 限制使用su命令的用户 3.可插拔式认证模块PAM 3.1 linux中的PAM安全认证 3.2 PAM认证原理​编辑 3.3 PAM认证的构成 3.4 P…

itables, Python 大型数据集显示工具

目录 前言 安装 特性 基本功能 显示表格 排序功能 搜索功能 分页显示 高级功能 自定义列的显示格式 高级搜索功能 实现数据的动态更新 集成外部JavaScript库 总结 前言 iTables库是Python中一个强大的工具&#xff0c;专门用于在Jupyter Notebook和其他IPython环境中以交…

Leetcode—1329. 将矩阵按对角线排序【中等】(unordered_map、priority_queue)

2024每日刷题&#xff08;121&#xff09; Leetcode—1329. 将矩阵按对角线排序 实现代码 class Solution { public:vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {const int m mat.size();const int n mat[0].size();unorder…

R语言--图形绘制

一&#xff0c;绘制简单图形 c1<- c(10,20,30,40,50) c2<-c(2,7,15,40,50) plot(c1,c2,typeb) 具体参数请参考R语言中的绘图技巧1&#xff1a;plot()函数参数汇总_r语言plot参数设置-CSDN博客 c1<- c(10,20,30,40,50) c2<-c(2,7,15,40,50) plot(c1,c2,typeb,col#…

这些小众工作软件让你事半功倍

大家好&#xff0c;我是追求高效工作的小红书种草小能手&#xff01;今天要和大家分享几款超实用的工作软件&#xff0c;它们可能不像那些大牌软件那样家喻户晓&#xff0c;但绝对能让你的工作生活焕然一新&#xff01;&#x1f31f; 1️⃣《亿可达》- &#x1f5a5;️自动化办…

第8章 软件工程

一、软件工程概述 &#xff08;一&#xff09;软件危机 1、含义&#xff1a;落后的软件生产方式无法满足迅速增长的计算机软件需求&#xff0c;从而导致软件开发与维护过程中出现一系列严重问题的现象。 2、解决方案&#xff1a;引入软件工程的思想。 &#xff08;二&#x…

【Qt】无法创建或打开CMake项目

无法创建或打开CMake项目 没有CMake选项 原因 卸载重装了qt&#xff0c;安装时勾选了cmake&#xff0c;发现还是一样没有。。。 后面发现是插件里没有勾选上CMake。。。很无语 不是应该默认就有的吗 不懂了 解决 插件勾选重启就好了

Python 操作PDF图片 – 添加、替换、删除PDF中的图片

PDF文件中的图片可以丰富文档内容&#xff0c;提升用户的阅读体验。除了在PDF中添加图片外&#xff0c;有时也需要替换或删除其中的图片&#xff0c;以改进视觉效果或更新信息。文本将提供以下三个示例&#xff0c;介绍如何使用Python 操作PDF文件中的图片&#xff1a; 目录 …