Day17_最长递增子序列

news/2025/3/19 0:03:48/文章来源:https://www.cnblogs.com/piphermitage/p/18780117

每日一题

面试题:最长递增子序列(Longest Increasing Subsequence, LIS)
题目描述
给定一个整数数组 nums,找到其中最长严格递增子序列的长度(子序列不要求连续)。
示例:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,5,7,101],长度为 4。


答案与分析

1. 动态规划解法(时间复杂度 O(n²))
思路

  • 定义 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。
  • 对每个 i,遍历 j0i-1,若 nums[i] > nums[j],则 dp[i] = max(dp[i], dp[j]+1)

代码实现

python

复制

def length_of_LIS(nums):dp = [1] * len(nums)for i in range(len(nums)):for j in range(i):if nums[i] > nums[j]:dp[i] = max(dp[i], dp[j] + 1)return max(dp) if nums else 0

分析

  • 时间复杂度为 O(n²),空间复杂度 O(n)。
  • 优点:思路直观,易于理解。
  • 缺点:当 n 较大时(如 n=1e4),性能较差。

2. 贪心 + 二分查找优化(时间复杂度 O(n log n))
思路

  • 维护一个数组 tails,其中 tails[i] 表示长度为 i+1 的递增子序列的最小末尾值。
  • 遍历数组,对每个数进行二分查找,找到其在 tails 中的位置并更新或插入。

代码实现

python

复制

def length_of_LIS(nums):tails = []for num in nums:left, right = 0, len(tails)while left < right:mid = (left + right) // 2if tails[mid] < num:left = mid + 1else:right = midif left == len(tails):tails.append(num)else:tails[left] = numreturn len(tails)

分析

  • 时间复杂度为 O(n log n),空间复杂度 O(n)。
  • 核心思想:通过维护 tails 数组,保证其严格递增。每次插入或替换时,使用二分查找优化效率。
  • 为什么能保证正确性?
    • 若当前数比 tails 所有元素大,说明可以形成更长的子序列。
    • 若当前数能替换 tails 中某个元素,说明可以优化后续子序列的构造(更小的末尾值更有利于后续扩展)。

面试考察点

  1. 动态规划基础:是否能设计状态转移方程。
  2. 算法优化能力:是否能想到贪心策略和二分查找的结合。
  3. 代码实现细节:二分查找的边界条件处理、数组更新逻辑。
  4. 复杂度分析:对时间/空间复杂度的理解和权衡能力。

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

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

相关文章

博客图床 VsCode + PigGo + 阿里云OSS方案

关键字 写博客,图床,VsCode,PigGo,阿里云OSS 背景环境 我想把我在本地写的markdown文档直接搬到CSDN上和博客园上,但是图片上传遇到了问题。我需要手动到不同平台上传文件,非常耗费时间和经历。 为了解决这个问题,我想到了图床方案,我只需要把图片链接放到我本地写好的…

20244203张晨曦 实验一《Python程序设计》实验报告

20244203张晨曦《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2442 姓名: 张晨曦 学号:20244203 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 专选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和…

Cobalt Strike基础

Cobalt Strike基础 Staged(有阶段) 在有阶段的执行方式中,分为Stager和Stage两个阶段Stager(初始执行载荷):​ 定义:Stager是Stage 1,是一个较小的、轻量级的初始执行载荷 ​ 作用:与服务端建立初始连接,并从服务器下载更大的Payload,也就是Stage2Stage(更大、…

OP222柔性振动白色料盘污染会引发的问题

下图为污损的料盘料盘污损会导致以下问题: 1.料盘里面缺料但是后面料仓就是不送料 柔性振动系统里面设置了加料个数,下图里面设置为15,表示如果相机识别区域里面的总阴影面积<15个零件面积,料仓加一次料。下图红框是识别区域,里面一道道横杠就是污损导致的阴影,这些阴…

鸿蒙特效教程05-鸿蒙很开门特效

鸿蒙特效教程05-鸿蒙很开门特效本教程适合HarmonyOS初学者,通过简单到复杂的步骤,通过层叠布局 + 动画,一步步实现这个"鸿蒙很开门"特效。本教程能收获Stack 层叠布局 animate、animateTo 动画 @State 状态管理最终效果预览 屏幕上有一个双开门,点击中间的按钮后…

An Elder Brother Is Like a Father :My True Story

![](https://img2024.cnblogs.com/blog/3617180/202503/3617180-20250318230914275-242579668.jpg)An Elder Brother Is Like a Father :My True Story In your life, do you have a very important person? Who is he/she? Why is he/she significant for you and whats you…

element-plus学习 -2025/3/18

{ ...this.form } 是 JavaScript 中的 ​扩展运算符(Spread Operator)​,它的作用是将 this.form 对象的所有属性“展开”到一个新的对象中 例如 form :{ name : , score: } 简易学生分数管理系统 element-plus实现 <!DOCTYPE html> <html lang="en">…

web161笔记(getimagesize()图片文件头检测)

这次上传失败了,尝试在头部加了图片文件头,就过去了,所以这里应该是用了getimagesize()进行检测getimagesize(): 会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求所以在上题的基础上都加个GIF89a图片头就可以了 GIF89a加个图⽚的头欺骗检测 .u…

MIT6.5840 2024 Spring Lab1

MIT6.5840 2024 Spring Lab1 前言本文主要作为笔记使用,这次实验基本是边查GO的语法边做的,所以代码写的不够优雅,无法充分发挥GO的一些特性,因此本文的代码实现有很大的优化空间,欢迎各位大佬指正,希望本文能给一些正在学习的小伙伴提供一些思路。最后希望小伙伴们不要抄代码,…

OP222机器人与柔性振动盘交互逻辑

1.机器人运行逻辑主体逻辑就是PLC发送取料指令后,机器人向柔性振动系统索要OK件的坐标-->柔性振动系统接收到指令后拍照,识别出OK件就发送其坐标,找不到OK件就振动一下再拍照-->机器人通过获取到的坐标去取料-->取料后检查真空吸盘负压信号,如果吸住了即取料成功,…

web157-web159笔记(+分号;过滤+()过滤)

web157 .user.ini正常上传了,但是在传mumuzi.png的时候出错看来⼜过滤了什么不知名的东⻄,测试删掉system报错,tac报错,然后发现是分号的问题。这⾥ 使⽤反引号(相当于shell_exec() )<?=`tac ../f*`?> (后来发现短标签可以不要分号…

20244213 实验一《Python程序设计》实验报告

实验一 课程:《Python程序设计》 班级: 2442 姓名: 孙爱宣 学号:20244213 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等;编…