力扣动态规划——0302

1. 前置知识:什么是 LIS?

LIS = Longest Increasing Subsequence最长递增子序列

给定一个数组,求最长的、满足递增(或非递减)的子序列长度。

  • 朴素 DP:O (n²)dp[i] = max(dp[j] + 1),j < i && nums[j] < nums[i]
  • 优化解法:贪心 + 二分 O(n log n)

贪心思想:维护一个数组 tailstails[i] 表示长度为 i+1 的递增子序列的最小可能末尾值。越小,后面越容易接更长的序列。


2. 题目一:俄罗斯套娃信封(严格递增 LIS)

LeetCode 354. Russian Doll Envelopes

2.1 题目描述

给定若干个信封,每个信封以 [w, h] 表示宽度和高度。当且仅当信封 A 的宽度和高度 都严格大于 信封 B 时,B 可以套入 A。求最多能套多少层。

2.2 关键思路:二维 → 一维 LIS

我们希望:

  • 宽度已经有序,只需要判断高度
  • 高度满足严格递增 → 就是 LIS 长度

2.3 排序规则(非常重要)

Arrays.sort(envelopes, (a, b) -> { if (a[0] != b[0]) { return a[0] - b[0]; // 宽度升序 } else { return b[1] - a[1]; // 宽度相同,高度降序 } }); 

2.4 为什么宽度相同要高度降序?

因为:宽度相同不能嵌套!

如果宽度相同、高度升序:[3,4], [3,5]高度 4 < 5,LIS 会认为可以递增,结果错误。

降序排列:[3,5], [3,4]5 > 4,不会被算进递增序列,保证正确性。

2.5 O (n log n) 贪心 + 二分代码

class Solution { public int maxEnvelopes(int[][] envelopes) { if (envelopes == null || envelopes.length == 0) { return 0; } Arrays.sort(envelopes, (a, b) -> { if (a[0] != b[0]) { return a[0] - b[0]; } else { return b[1] - a[1]; } }); int n = envelopes.length; int[] tails = new int[n]; int len = 0; for (int[] e : envelopes) { int h = e[1]; int idx = Arrays.binarySearch(tails, 0, len, h); if (idx < 0) { idx = -idx - 1; } tails[idx] = h; if (idx == len) { len++; } } return len; } } 

2.6 二分查找解释

  • 查找第一个 >= 当前高度 的位置
  • 替换它,让末尾尽可能小
  • 如果比所有都大,直接加入,长度 + 1

3. 题目二:最长障碍赛跑路线(非递减 LIS)

LeetCode 964. Longest Obstacle Course At Each Position

3.1 题目描述

给一个数组 obstacles,表示障碍高度。对每个位置 i,求:

  • 必须包含第 i 个障碍
  • 顺序不变
  • 高度 非递减(可以相等)的最长子序列长度。

3.2 关键点

这是 非递减 LIS,不是严格递增!允许:<=

3.3 与套娃信封的区别

  • 套娃信封:严格递增 → 找第一个 >= x
  • 障碍路线:非递减 → 找第一个 > x

只改一行二分条件!

3.4 完整代码

class Solution { public int[] longestObstacleCourseAtEachPosition(int[] obstacles) { List<Integer> list = new ArrayList<>(); int n = obstacles.length; int[] ans = new int[n]; for (int i = 0; i < n; i++) { int x = obstacles[i]; int l = 0, r = list.size(); while (l < r) { int mid = (l + r) / 2; if (list.get(mid) <= x) { l = mid + 1; } else { r = mid; } } if (l == list.size()) { list.add(x); } else { list.set(l, x); } ans[i] = l + 1; } return ans; } } 

3.5 为什么这么写二分?

我们要找:第一个大于 x 的位置 l

那么:

  • 0 ~ l-1 都是 ≤x
  • 所以以 x 结尾的最长长度 = l + 1

完美对应题目要求的非递减


4. 两道题核心对比(一张表看懂)

题目序列类型二分查找目标
套娃信封严格递增第一个 >= x
障碍赛跑非递减第一个 > x

共同点:

  • 都是 LIS 模型
  • 都用贪心 + 二分优化到 O (n log n)
  • 都维护 “最小末尾” 数组

不同点:

  • 套娃信封需要先排序
  • 障碍路线直接求 LIS
  • 二分条件差一个等号

5. 文末总结

看完这两道题,你应该彻底掌握:

  1. LIS 贪心 + 二分是通用模板
  2. 严格递增 / 非递减 只在二分条件区分
  3. 套娃信封 = 排序 + 严格递增 LIS
  4. 障碍路线 = 非递减 LIS(每个位置求长度)
  5. O (n log n) 是大数据量下的唯一解法

Read more

从代码混乱到井然有序:飞算JavaAI的智能治理之道

从代码混乱到井然有序:飞算JavaAI的智能治理之道

文章目录 * 一、前言 * 二、飞算JavaAI平台 * 三、飞算JavaAI安装流程 * 3.1 Idea安装配置 * 3.2 官网注册登入 * 四、飞算JavaAI独特魅力:合并项目场景 * 4.1 ERP老项目精准翻新:保留核心逻辑的智能改造方案 * 4.2 智能合并:重构ERP系统的代码迷宫 * 4.3 ERP接口智能导航:模块化精准治理每一处数据流 * 4.4 其他功能 * 五、工程代码快速构建 * 六、飞算 JavaAI 与其他 AI 编程工具对比 * 七、总结与分析 飞算JavaAI彻底颠覆了传统AI代码生成的不可靠印象,以精准的需求理解和高质量的代码输出重新定义了智能编程体验。不同于那些需要反复调试的"半成品代码",它能直接生成符合企业级规范的Java代码,从Entity到Controller一气呵成,让开发者真正感受到&

By Ne0inhk
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题

如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题

如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题 摘要 本文针对Java项目启动时出现的java.io.IOException: closed错误,提供系统性解决方案。该异常通常由流资源异常关闭或损坏引发,常见于Maven依赖损坏(mvn dependency:purge-local-repository)、Wrapper脚本缺失(mvn wrapper:wrapper)、IDE缓存异常(Invalidate Caches)或Spring Boot插件配置不当(显式指定spring-boot-maven-plugin版本)等情况。通过分步操作(清理本地仓库、重装Wrapper、清理IDE缓存、检查pom配置)并结合日志调试(-X参数),可快速定位问题根源。最后提出预防建议:CI/CD定期清理依赖、版本化Wrapper文件、固定插件版本,有效提升项目启动稳定性与团队协作一致性。 关键词: Java IOException, Maven依赖修复, Spring

By Ne0inhk
华为OD机试双机位C卷-FLASH坏块监测系统(Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷-FLASH坏块监测系统(Py/Java/C/C++/Js/Go)

FLASH坏块监测系统 华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 开发一个 FLASH 坏块监测系统,能够监测 FLASH 中坏块的数量。FLASH 介质以一个大小为 m×n的二维二进制矩阵表示,其中:0 表示正常,1 表示异常。最初,FLASH 介质中的所有单元格都是正常(即,所有单元格都是 0)。 系统运行过程中,FLASH 坏块不断产生:随着系统持续运行,某一个时刻 i,FLASH 介质中的某个单元格 (ri,ci)由正常变为异常。返回一个整数数组 result,其中 result[i] 是 FLASH 介质中第

By Ne0inhk