当前位置: 首页 > news >正文

动态规划学习——子序列问题

目录

​编辑

一,最长定差子序列

1.题目

2,题目接口

 3,解题思路及其代码


一,最长定差子序列

1.题目

给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。

子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。

示例 1:

输入:arr = [1,2,3,4], difference = 1
输出:4
解释:最长的等差子序列是 [1,2,3,4]。

示例 2:

输入:arr = [1,3,5,7], difference = 1
输出:1
解释:最长的等差子序列是任意单个元素。

示例 3:

输入:arr = [1,5,7,8,5,3,4,2,1], difference = -2
输出:4
解释:最长的等差子序列是 [7,5,3,1]。

2,题目接口

class Solution {
public:int longestSubsequence(vector<int>& arr, int difference) {}
};

 3,解题思路及其代码

1.状态转移方程:    

这道题要我们求的是最长定差子序列问题,不再是最长子序列。这里的关键便是定差,也就是说在我们知道差以后我们便可以知道第2个数的值。我们的dp[i] 表示为以i位置为结尾的最长等差子序列。

 2.初始化:

 当我们的每个nums[i]单独构成一个子序列时长度为1,所以我们初始化时边初始化为1即可。

在明确好这些后便可以写出如下代码:

class Solution {
public:int longestSubsequence(vector<int>& arr, int difference) {int n = arr.size();vector<int>dp(n,1);int Maxlenth = 1;for(int i = 0;i<n;i++){int num = arr[i]+difference;//找定差for( int j = i+1;j<n;j++){if(arr[j] == num){dp[j] = dp[i]+1;}}Maxlenth = max(Maxlenth,dp[i]);//每次都要更新一下最大值}return Maxlenth;}
};

但是,这个代码是过不了的。因为这个代码的时间复杂度为O(n^2)。所以我们要对这个代码做一些优化。优化的秘诀便是hash表:unordered_map。改进思路如下:

1.先创建一个hash表。

2.将arr里面的所有元素和元素的对应下标放到hash表中构成映射,arr[i]作key,下标作value。

现在改进代码如下:

class Solution {
public:int longestSubsequence(vector<int>& arr, int difference) {unordered_map<int,int> hash;//在hash表里做dpint n = arr.size();int Max = 1;hash[arr[0]] = 1;for(int i = 1;i<n;i++){hash[arr[i]] = hash[arr[i]-difference]+1;//如果arr[i]-difference那也会访问最后一个arr[i]-difference的值。因为hash的底层插入是头插Max = max(Max,hash[arr[i]]);}return Max;}
};

提交:过啦!!!

相关文章:

  • python之UDP网络应用程序开发
  • selinux-policy-default(2:2.20231119-2)软件包内容详细介绍(2)
  • ⑧【HyperLoglog】Redis数据类型:HyperLoglog [使用手册]
  • 搜索引擎---项目测试
  • 如何取消thunar为默认文件管理器
  • MySQL索引 Error1071
  • 基于单片机的温湿度检测系统设计
  • 遥遥领先!TinyEngine 低代码引擎更新升级!AI 已成功部署!
  • JMeter 设置请求头信息的详细步骤
  • ⑦【Redis GEO 】Redis常用数据类型:GEO [使用手册]
  • centos7卸载mongodb数据重新安装时无法安装的问题
  • 3.1 CPU内部结构与时钟与指令
  • Vite CSS Module 优雅的处理样式隔离
  • R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析
  • CentOS 7实现类似于Kali Linux中的自动补全功能
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • C++类中的特殊成员函数
  • CSS中外联样式表代表的含义
  • Debian下无root权限使用Python访问Oracle
  • ES6语法详解(一)
  • js面向对象
  • JS学习笔记——闭包
  • js中的正则表达式入门
  • mockjs让前端开发独立于后端
  • Spark学习笔记之相关记录
  • Unix命令
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 官方解决所有 npm 全局安装权限问题
  • 欢迎参加第二届中国游戏开发者大会
  • 精彩代码 vue.js
  • 看域名解析域名安全对SEO的影响
  • 微信支付JSAPI,实测!终极方案
  • 优秀架构师必须掌握的架构思维
  • 主流的CSS水平和垂直居中技术大全
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • UI设计初学者应该如何入门?
  • 我们雇佣了一只大猴子...
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (笔试题)合法字符串
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)库存超卖案例实战——优化redis分布式锁
  • (原創) 未来三学期想要修的课 (日記)
  • (转载)hibernate缓存
  • .NET CF命令行调试器MDbg入门(一)
  • .NET 反射的使用
  • .Net6使用WebSocket与前端进行通信
  • .NET中两种OCR方式对比
  • :O)修改linux硬件时间
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?