学习路线参考:最长递增子序列【基础算法精讲 20】_哔哩哔哩_bilibili
ps:笔记和代码按本人理解整理,重思路
【如果笔记对你有帮助,欢迎关注&点赞&收藏,收到正反馈会加快更新!谢谢支持!】
上期笔记
线性DP学习笔记(一):最长公共子序列,编辑距离-CSDN博客
题目1:最长递增子序列
- 思路:建立dp表,dp[i] 表示 “以nums[i]结尾的最长递增子序列长度”
- dp更新:对于dp[i],比较 “nums[i] 和 nums[j] (i > j) ” (nums[j]在nums[i]前面)
(看是否能把递增子序列变成 […, nums[j], nums[i]],取最长)
- 这道题为什么不可以用单调栈来做?单调栈不能处理全局的不连续的子序列
- 代码:
class Solution: def lengthOfLIS(self, nums: List[int]) -> int: n = len(nums) dp = [1]*n for i in range(n): for j in range(i): if nums[i] > nums[j]: dp[i] = max(dp[i], dp[j]+1) return max(dp)
题目2:将三个组排序
- 变化:递增 → 非递减;子序列长度 → 操作数(= n - 子序列长度)
- 代码:
class Solution: def minimumOperations(self, nums: List[int]) -> int: n = len(nums) dp = [1]*n for i in range(n): for j in range(i): if nums[i] >= nums[j]: dp[i] = max(dp[i], dp[j] + 1) return n - max(dp)