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

LeetCode Medium|【300. 最长递增子序列】

力扣题目链接
本题有一个简单的解法是动态规划,时间复杂度 O(n^2),笔者在之前曾做过相关记录:300.最长递增子序列
现在我们来讨论 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))的解法

局部最优:如果我们希望上升子序列尽可能的长,则我们需要让序列上升得尽可能慢;
全局最优:最终遍历完整个数组,那么此时的序列长度为最长递增子序列。

所以有一个很直观的思路就出来了:

  • 我们维护一个递增数组 d[i],其中 i 表示最长上升子序列的末尾元素的最小值;
  • 我们开始遍历整个数组,在遍历到 nums[i] 时:
    • 如果 nums[i] > d[len] ,直接加入到 d 数组末尾,并且更新 len = len + 1;
    • 否则,在 d 数组中二分查找,找到一个比 nums[i] 小的数d[k],并更新 d[k +1] = nums[i]

这里举一个例子:
对于序列[0, 8, 4, 12, 2],

  • 第一步插入 0,d=[0];

  • 第二步插入 8,d=[0,8];

  • 第三步插入 4,d=[0,4];

  • 第四步插入 12,d=[0,4,12];

  • 第五步插入 2,d=[0,2,12]。

如果你能了解二分查找找到插入位置的话,此题非常简单

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();if (n == 0) {return 0; // 如果数组为空,返回 0}vector<int> d(n + 1, 0); // 用于存储最长递增子序列的数组int len = 1; // 当前 LIS 的长度d[len] = nums[0]; // 初始化第一个元素for (int i = 1; i < n; ++i) {if (nums[i] > d[len]) {// 如果 nums[i] 大于当前 LIS 的最后一个元素d[++len] = nums[i];} else {// 否则,在 d 数组中找到第一个大于或等于 nums[i] 的位置,并替换它int l = 1, r = len, pos = 0;while (l <= r) {int mid = (l + r) / 2;if (d[mid] < nums[i]) {pos = mid; // 找到小于 nums[i] 的最大位置l = mid + 1;} else {r = mid - 1;}}d[pos + 1] = nums[i]; // 替换位置 pos+1 处的值}}return len; // 返回最长递增子序列的长度}
};
http://www.lryc.cn/news/418572.html

相关文章:

  • jenkins自动化构建docker镜像并上传至harbor仓库
  • Java高级Day23-HashMap
  • 【学术会议征稿】第四届电气工程与计算机技术国际学术会议(ICEECT2024)
  • Spring boot tomcat使用自定义线程池监控线程数量告警
  • K8S子节点加入主节点访问MaterAPI报错:Unauthorized 401
  • C++ Poco服务端框架中JSON的使用
  • leetcode787. K 站中转内最便宜的航班——优先队列优化的Dijkstra算法+剪枝
  • 赛盈分销亮相AI科技大会暨亚马逊新增长大会,与企业共话跨境品牌发展新机遇!
  • Nacos-配置中心
  • ava中的文件操作、IO流、递归和字符集
  • 生成式人工智能安全评估体系构建
  • NRBO-XGBoost分类 基于牛顿-拉夫逊优化算法[24年最新算法]-XGBoost多特征分类预测+交叉验证
  • synchronized实现原理及优化
  • NLP 之词的表示与语言模型
  • 每天一个数据分析题(四百七十一)- 假设检验
  • 《系统架构设计师教程(第2版)》第13章-层次式架构设计理论与实践-04-数据访问层设计
  • 【视觉SLAM】 十四讲ch7习题
  • K-近邻算法(二)
  • WPF学习(2)-UniformGrid控件(均分布局)+StackPanel控件(栈式布局)
  • ANTSDR E310
  • MySQL 5.7 DDL 与 GH-OST 对比分析
  • 【Python】爬取网易新闻今日热点列表数据并导出
  • 软件设计之HTML5
  • CnosDB 元数据集群 – 分布式时序数据库的大脑
  • 白骑士的Matlab教学进阶篇 2.5 Simulink
  • linux安装anaconda
  • python装饰器作用和使用场景
  • Apache Tomcat 7下载、安装、环境变量配置 详细教程
  • SQL注入实例(sqli-labs/less-20)
  • Linux Shell面试题大全及参考答案(3万字长文)