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

力扣HOT100之动态规划:300. 最长递增子序列


这道题之前刷代码随想录的时候也刷过,现在又给忘完了。自己尝试着写了一下,发现怎么写都写不对,直接去看视频了。。我自己写的时候的定义是:考虑下标0 ~ i范围内索赔能取到的最长严格递增子序列的长度,后面发现在写递推公式的时候怎么都写不对,这道题的dp数组的含义为:以nums[i]为结尾的情况下,其最长严格递增子序列的长度。那么递推公式就很好想了,在以nums[i]为结尾的情况下,我们从头开始搜索,如果遇到nums[j] < nums[i]的情况,则说明nums[i]可以作为以nums[j]结尾的子序列的下一个元素,我们需要对比dp[j] + 1dp[i]之间的大小关系,取较大值作为新的dp[i]。遍历顺序也很好想,二重循环都是从小到大遍历的。下面写下递归五部曲:
1.确定dp[i]的含义:以nums[i]为结尾的情况下,其最长严格递增子序列的长度
2.确定递推公式 dp[i] = max(dp[j] + 1, dp[i]) (只有nums[i] > nums[j]才会触发)
3.dp数组初始化 dp[0] = 1
4.确定遍历顺序:从左往右遍历
5.打印数组(省略)
值得注意的是,我们最终要返回的不一定是dp[s.size() - 1],因为最后一个元素不一定是最大元素,最大元素可能在前面的任意位置,例如数组[0, 1, 2, 3, 4, 5, 1],最大长度在元素5这里产生,我们需要用一个额外变量result来维护最大长度。

class Solution {
public:int lengthOfLIS(vector<int>& nums) {//1.确定dp[i]的含义:以nums[i]为结尾的情况下,其最长严格递增子序列的长度//2.确定递推公式  dp[i] = max(dp[j] + 1, dp[i]) (只有nums[i] > nums[j]才会触发)//3.dp数组初始化 dp[0] = 1  //4.确定遍历顺序:从左往右遍历//5.打印数组(省略)int n = nums.size();vector<int> dp(n, 1);int result = 1;   //用于记录整个数组中的最长子序列的长度//初始化dp[0] = 1;for(int i = 1; i < n; i++){   //逐渐扩大数组范围for(int j = 0; j < i; j++){   //内循环则确定nums[i]为结尾的情况下所能取到的最长严格递增子序列的长度if(nums[i] > nums[j])  //nums[i]可以作为以nums[j]结尾的子序列的下一个元素时dp[i] = max(dp[j] + 1, dp[i]);}result = max(result, dp[i]);  //维护最长严格递增子序列的长度}return result;}
};

相关文章:

  • Vue-Router简版手写实现
  • go|context源码解析
  • 极坐标求解的二重积分适合特征
  • Python(十四)
  • 飞致云开源社区月度动态报告(2025年5月)
  • 【数据结构】——二叉树--链式结构
  • 考研系列—操作系统:第四章、文件管理(part.1)
  • C++ 栈(Stack)与队列(Queue)深度解析:从原理到实战
  • Linux 网络流量监控实战:使用 iftop 精准定位高带宽连接
  • 前端面经 websocket
  • 第四十一天打卡
  • Azure DevOps 管道部署系列之二IIS
  • Oracle DG库控制文件IO错误导致宕机的应急处理
  • 赛博算命之“帝王之术”——奇门遁甲的JAVA实现
  • Redis最佳实践——安全与稳定性保障之数据持久化详解
  • 普中STM32F103ZET6开发攻略(一)
  • Java代码重构:如何提升项目的可维护性和扩展性?
  • Android之ListView
  • 第十二节:第三部分:集合框架:List系列集合:特点、方法、遍历方式、ArrayList集合的底层原理
  • TK海外抢单源码/指定卡单
  • 羽毛球赛事级别分类/百度seo公司哪家好一点
  • 全站仪为什么要建站/百度竞价托管费用
  • 兴科cms网站建设系统/比较成功的网络营销案例
  • 网站建设用什么网站好一点/网站运营推广方案
  • 游戏官网做的好的网站/专业排名优化工具
  • wordpress 媒体选项/长春网站优化流程