[LeetCode] 300、最长上升子序列
📅 2026/7/11 10:20:11
👁️ 次浏览
题目描述给定一个无序的整数数组找到其中最长上升子序列的长度。示例输入:[10,9,2,5,3,7,101,18]输出:4解释:最长的上升子序列是[2,3,7,101]它的长度是4。说明:可能会有多种最长上升子序列的组合你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶: 你能将算法的时间复杂度降低到O ( n l o g n ) O(n log n)O(nlogn)吗?解题思路这是一个子序列问题子序列问题基本都可以归化为“动态规划”问题。动态规划四要素状态表示、初始化、状态转移方程、返回值使用数组cell保存每步子问题的最优解cell[i]代表以nums[i]为结尾的最长上升子序列长度求解cell[i]时向前遍历找出比i元素小的元素j状态转移方程为cell[i] maxcell[i], cell[j] 1)。0 j i cell[j] cell[i]初始化cell[0] 1一定要把整个数组全部初始化为1迭代过程中不断更新最大值返回值为迭代过程中的最大值。两次遍历数组时间复杂度O ( n 2 ) O(n^2)O(n2)。动态规划 二分进阶要求时间复杂度要求O ( n l o g n ) O(nlogn)O(nlogn)立马想到二分。这个思路比较巧妙很具小巧思。新建数组cell用于保存最长上升子序列保存的是序列不是状态表示了。对原序列进行遍历将每位元素二分插入cell中。如果cell中元素都比它小将它插到最后。否则用它覆盖掉大于等于它的元素中最小的那个。总之思想就是让cell中存储比较小的元素。这样cell未必是真实的最长上升子序列但长度是对的。参考代码动态规划也要会classSolution{public:intlengthOfLIS(vectorintnums){intlengthnums.size();if(length1){return1;}intres1;// 结果默认值为1vectorintdp(length,1);for(inti1;ilength;i){for(intj0;ji;j){if(nums[j]nums[i]){dp[i]max(dp[i],dp[j]1);}}resmax(res,dp[i]);}returnres;}};按照模板写的二分推荐核心思想维护一个数组 res始终保持严格递增且 res 的长度就是当前最长上升子序列的长度。关键点res 不一定是真实的最长子序列但它的长度一定是对的。为什么替换不会破坏长度的正确性替换操作只是把 res[idx] 换成更小的值既没有让 res 变长长度不变也没有让 res 变短长度不变只是让 res[idx] 变得更小为后续元素创造更大的上升空间一句话总结res 中的元素不一定是真实子序列但通过贪心地用更小的值替换保证了 res 始终是最优状态使得后续元素有最大的上升空间因此 res.size() 始终等于当前最长上升子序列的长度。classSolution{public:intlengthOfLIS(vectorintnums){intleft0,rightnums.size()-1;vectorintres;for(inti0;inums.size();i){if(res.empty()||nums[i]res.back()){res.push_back(nums[i]);continue;}intidxbinarySearchIdx(res,nums[i]);// 注意这里传的数组是resres[idx]nums[i];}returnres.size();}// 首先要明确我们的目的是要找第一个“大于等于k”的元素的下标intbinarySearchIdx(vectorintnums,inttarget){intleft0,rightnums.size()-1;while(leftright){intmidleft(right-left)/2;if(nums[mid]target){leftmid1;}else{rightmid;}}returnleft;}};进阶要求返回最长的上升子序列核心思路在 DP 的同时用一个 path 数组记录每个位置的最优前驱节点最后从终点往前回溯。参考代码基于上述dp的方法改动几点而已classSolution{public:vectorintlengthOfLIS(vectorintnums){intlengthnums.size();if(length1){return{nums[0]};}intres1;intendPos0;// 新增记录最长子序列的结束位置vectorintdp(length,1);// dp[i] 表示以 nums[i] 结尾的最长上升子序列长度vectorintpath(length,-1);// 新增path[i] 记录每个位置 i 的前驱节点索引默认-1for(inti1;ilength;i){for(intj0;ji;j){if(nums[j]nums[i]){if(dp[j]1dp[i]){// 原来的 max 改成 if方便同时更新 pathdp[i]dp[j]1;path[i]j;// 新增更新前驱}}}if(dp[i]res){resdp[i];endPosi;// 新增更新结束位置}}// 新增从 endPos 沿 path 回溯还原子序列vectorintresult;for(intiendPos;i!-1;ipath[i]){// 注意这里的 i path[i] 操作很骚result.push_back(nums[i]);}reverse(result.begin(),result.end());returnresult;}};
KMS智能激活脚本:5分钟解决Windows和Office永久激活难题 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO
还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档突然变成…
📅 2026/7/11 10:20:11
34 UDS 0x22与0x2E:读取与写入ECU的“黑匣子”
老张上周又来找我了,这次他一脸沮丧:“我明明用0x22读到了ECU的VIN码,但用0x2E写回去时,ECU直接NRC了,代码是0x13(不正确消息长度或格式)。”
我让他把报文贴出来一看,差点笑出声——他写的数据长度比读出来的多了2个字…
📅 2026/7/11 10:19:11
前端错误监控体系的搭建:从 Sentry SDK 集成到 Source Map 上传闭环
错误监控体系的核心价值不是收集错误,而是快速定位错误根因。生产环境的代码经过压缩混淆后,堆栈信息只剩下单字母变量名和行号偏移。通过 Source Map 将压缩代码映射回源码…
📅 2026/7/11 10:19:11
Python异步编程在运维工具中的应用:asyncio与aiohttp构建高性能并发巡检系统
一、引言:运维脚本的性能天花板
运维工程师每天都在写脚本:服务健康检查、批量执行命令、跨集群巡检、日志采集、指标上报。这些脚本有一个共同特征——I/O密集型。…
📅 2026/7/11 12:14:51
title: “影刀RPA Word模板自动填写:批量生成合同报告” date: 2026-07-01 author: 林焱
影刀RPA Word模板自动填写:批量生成合同报告
HR每月要生成200份员工劳动合同,财务每周要输出50份项目报告,这类"格式固定、只有数据…
📅 2026/7/11 12:14:51
如何高效解决Steam Deck Windows兼容性问题:专业驱动适配方案 【免费下载链接】steam-deck-windows-usermode-driver A windows usermode controller driver for the steam deck internal controller. 项目地址: https://gitcode.com/gh_mirrors/st/steam-deck-wi…
📅 2026/7/11 12:14:51
技术深度解析:Decky Loader插件生态的系统故障排除与优化策略 【免费下载链接】decky-loader A plugin loader for the Steam Deck. 项目地址: https://gitcode.com/gh_mirrors/de/decky-loader
在开源工具生态中,Decky Loader作为Steam Deck的核…
📅 2026/7/11 12:14:51
Three.js 体积渲染在链上数据可视化中的应用:体素化与 Ray Marching 实践
一、链上数据的可视化困境:平面图表的信息密度天花板
区块链数据天然是三维的——时间(区块高度)、空间(地址间交互)、价值&…
📅 2026/7/11 12:14:51
SpriteBuilder本地化工具:如何为游戏添加多语言支持的完整教程 【免费下载链接】SpriteBuilder Objective-C Game Development Suite 项目地址: https://gitcode.com/gh_mirrors/sp/SpriteBuilder
想要让你的游戏走向全球市场吗?SpriteBuilder本地…
📅 2026/7/11 12:13:51
摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计…
📅 2026/7/11 0:00:31
1. 命令简介gpm 是 Linux 系统下运行于虚拟控制台(文字终端模式)的鼠标服务器。它的主要功能是在没有图形界面的纯文本环境中,为虚拟控制台提供鼠标支持,允许用户使用鼠标进行文本的选择、复制和粘贴操作,极大地提升了…
📅 2026/7/11 0:00:31
导语
先澄清一个常被混用的概念:BI试点"上线",并不等于试点"验收通过"。很多企业把仪表板做出来、账号发下去、培训开完场,就默认试点已经跑通,随后进入推广阶段——结果推广到第二个部门、第三个业务线时&am…
📅 2026/7/11 0:00:31
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/10 22:46:54
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/10 22:46:54
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/10 22:46:54
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/10 22:46:54
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/10 22:46:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/10 22:46:54