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

【算法日记】Day 9 动态规划专题——最长递增子序列问题及扩展

Abstract#动态规划#最长递增子序列#二分查找#排序

1. 题目

  • 题目:LeetCode 354. 俄罗斯套娃信封
  • 核心思路:先将信封按宽度升序排序,若宽度相同则按高度降序排序。然后对排序后的高度序列求最长递增子序列(LIS)的长度,即为最多能套娃的信封数。宽度相同按高度降序是为了避免相同宽度的信封互相套娃(因为宽度相等不能嵌套,降序后高度不会递增,从而不会错误地计入LIS)。
  • 复杂度:时间复杂度O ( n l o g n ) O(n log n)O(nlogn)(排序O ( n l o g n ) O(n log n)O(nlogn)+ LIS二分O ( n l o g n ) O(n log n)O(nlogn)),空间复杂度O ( n ) O(n)O(n)(存储 ends 数组)。

2. 代码

classSolution{public:boolcompare(vector<int>&a,vector<int>&b){returna[0]!=b[0]?a[0]<b[0]:a[1]>b[1];}// 二分查找第一个>=num的位置(ends数组递增)intBinarySearch(vector<int>&ends,intlen,intnum){intl=0,r=len-1,m,ans=-1;while(l<=r){m=l+((r-l)>>1);if(ends[m]>=num){r=m-1;ans=m;}elsel=m+1;}returnans;}intmaxEnvelopes(vector<vector<int>>&envelopes){intn=envelopes.size();sort(envelopes.begin(),envelopes.end(),compare);vector<int>ends(n);// ends[i]表示长度为i + 1的递增子序列的最小末尾值intlen=0;for(inti=0,find;i<n;++i){find=BinarySearch(ends,len,envelopes[i][1]);if(find==-1)ends[len++]=envelopes[i][1];elseends[find]=envelopes[i][1];}returnlen;}};

3. 心得

  • LIS问题优化:该问题本质上是一个二维偏序LIS问题,在题目条件下可以借助排序转化为简单的一维LIS问题。尽管都是一维,但与模板题(见相关题目第一题)不同的是,该问题不能直接用经典DP数组来求解(时间复杂度为O ( n 2 ) O(n^2)O(n2),在该题的数据量下会超时)。应该使用LIS的优化解法:引入数组ends表示各个长度的递增子序列的最小末尾值,随后在遍历主数组的过程中,抓住ends数组递增的特点,利用二分搜索寻找最左侧大于等于主数组当前位置数的元素,并由此更新ends,最终ends的长度即为LIS的长度。

  • 传参避免拷贝:在自定义比较函数compare或二分查找函数中,参数应使用引用传递(如vector<int>& a)而不是值传递。如果传值,每次调用都会拷贝整个vector产生额外的内存和时间开销,对于大数据量(如n=10 5 10^5105)会直接内存超限。另外一种比较直接的解决方案是设置全局变量,避免传参。

  • 静态比较函数:自定义比较函数在类内需要声明为static,否则sort无法调用。

4. 相关题目

  • LeetCode 300. 最长递增子序列
  • LeetCode 646. 最长数对链
  • LeetCode 2111. 使数组 K 递增的最少操作次数
http://www.jsqmd.com/news/610066/

相关文章:

  • I2C总线原理与应用实战指南
  • YOLO11 改进 - 特征融合 | MSAA多尺度注意力聚合模块, 多尺度卷积融合与双通道注意力机制
  • 视频处理效率提升方案:基于JianYingApi的自动化剪辑实践指南
  • 嵌入式C语言设计模式实践:观察者与责任链模式
  • 2026年上海房产纠纷处理,这五位律师的专业服务值得您关注 - 2026年企业推荐榜
  • YOLOv11 改进 - 注意力机制 | ShuffleAttn序列洗牌注意力,解决多向序列建模中的通道异构与信息不对齐问题
  • 桥梁支座选型指南:2026年如何甄别重庆实力厂家? - 2026年企业推荐榜
  • Intex Spa嵌入式信号桥接库spaiot-lib技术解析
  • 从PyTorch到FPGA:手把手教你将MobileNetV2模型部署到Zynq平台(附完整代码)
  • 2026淘宝客服外包哪家好:杭州京东客服外包/杭州天猫客服外包/杭州小红书客服外包/杭州快手客服外包/选择指南 - 优质品牌商家
  • ID12RFID库详解:嵌入式125kHz RFID读卡实践指南
  • 从《节奏医生》到你的游戏:拆解Koreographer Pro版如何实现高级音频集成(Wwise/FMOD)
  • 再次革新 .NET 的构建和发布方式(三)鲜
  • 嵌入式DSP库:面向实时系统的定点信号处理基础设施
  • 【typst-rs】info.rs文件
  • CANoe故障注入秘籍:用TestDisableMsg模拟总线异常的真实案例
  • GF-2卫星影像融合实战:ENVI与ArcGIS效果对比(附NNDiffuse参数详解)
  • 技术迭代与供应链韧性:2026年5050灯珠核心服务商五强解析 - 2026年企业推荐榜
  • 嵌入式系统软件抗干扰技术实战解析
  • ChatBI赋能企业智能决策:奥威BI在零售与制造领域的创新实践
  • 从CPython源码级剖析Python 3.14 JIT编译器:如何用traceback.print_jit_stats()定位热点函数并实现亚毫秒级响应
  • 阻抗匹配原理与实战:射频电路设计核心技能
  • RemoteIR库:NCS36510超低功耗红外解码驱动
  • 2026围墙护栏服务商五强发布:谁在定义行业新标准? - 2026年企业推荐榜
  • 品牌运营必看:如何用小红书API监控竞品动态(含免费工具推荐)
  • IAR嵌入式工程多节点配置与管理详解
  • 2026年河北一体化泵站选购指南:五大优质生产厂家深度测评与推荐 - 2026年企业推荐榜
  • 校园无人超市管理系统设计与实现
  • RWA抵押:稳定币的“硬锚革命”如何撬动十万亿级金融新基建?
  • MCP3425 16位I²C接口ADC原理与嵌入式应用实战