LeetCode刷题之HOT100之最长递增子序列

2024/7/10 晴,睡眠质量良好,到实验室时间9.18。知了在窗外聒噪,似乎让我安心,静下来。做题吧

1、题目描述

在这里插入图片描述

2、算法分析

给一个整数数组,要求出里面最长严格递增子序列的长度。遇到这种问题,想到的就是DP算法,将大的问题转化成小问题,再递归。算法思路:

  1. 定义状态
    首先,我们定义一个数组 dp,其中 dp[i] 表示以 nums[i]结尾的最长递增子序列的长度。这个状态定义是动态规划问题的关键,它允许我们通过已解决的小问题(即子问题)来逐步构建出原问题的解。
  2. 初始化状态
    由于每个元素至少可以自成一个递增子序列,因此我们将 dp 数组的所有元素初始化为 1。特别地,dp[0] 也被初始化为1,因为数组的第一个元素本身就构成了一个长度为 1 的递增子序列。
  3. 状态转移方程
    对于数组中的每个元素 nums[i](从索引 1 开始遍历,因为索引 0 已经初始化),我们检查它之前的所有元素
    nums[j](其中 j0i-1)。如果 nums[i] > nums[j],则说明我们可以将 nums[i] 加到以nums[j] 结尾的递增子序列的末尾,从而形成一个更长的递增子序列。此时,我们需要更新 dp[i]dp[j] + 1dp[i] 之间的较大值,以确保 dp[i] 总是存储以 nums[i] 结尾的最长递增子序列的长度。

状态转移方程可以表示为:

dp[i] = max(dp[i], dp[j] + 1) if nums[i] > nums[j]
  1. 记录结果 在遍历过程中,我们还需要记录一个全局的最大值 maxRes,用于存储遍历到目前为止找到的最长递增子序列的长度。每次更新dp[i] 后,我们都将其与 maxRes 进行比较,并更新 maxRes 为较大值。
  2. 返回结果 遍历完整个数组后,maxRes 中存储的就是整个数组的最长递增子序列的长度,我们将其作为函数的返回值。

3、代码

public int lengthOfLIS(int[] nums) {// 如果数组为空,则最长递增子序列的长度为0if(nums.length == 0){return 0;}// 创建一个dp数组来存储以每个元素为结尾的最长递增子序列的长度  // dp[i]表示以nums[i]为结尾的最长递增子序列的长度int[] dp = new int[nums.length];// 初始化dp数组,因为每个元素至少可以自成一个递增子序列dp[0] = 1;// 初始化最长递增子序列的长度为1(至少包含自身)int maxRes = 1;// 遍历数组中的每个元素(除了第一个元素,因为已经初始化)for(int i = 1; i < nums.length; i++){// 初始化dp[i]为1,因为每个元素至少可以自成一个递增子序列dp[i] = 1;// 遍历当前元素之前的所有元素for(int j = 0; j < i; j++){// 如果当前元素大于之前的某个元素,说明可以将当前元素添加到以nums[j]为结尾的递增子序列之后  // 从而形成一个更长的递增子序列  if(nums[i] > nums[j]){// 更新dp[i]为当前已找到的最长递增子序列长度+1和dp[i]中的较大值 dp[i] = Math.max(dp[i], dp[j] + 1);}}// 更新最长递增子序列的长度,取当前遍历过的所有dp[i]中的最大值maxRes = Math.max(maxRes, dp[i]);}// 返回最长递增子序列的长度return maxRes;}

4、复杂度分析

  • 时间复杂度 O ( n 2 ) O(n^{2}) O(n2),其中 n 为数组 nums 的长度。动态规划的状态数为 n,计算状态 dp[i] 时,需要 O(n)
    的时间遍历 dp[0…i−1] 的所有状态,所以总时间复杂度为 O ( n 2 ) O(n^{2}) O(n2)
  • 空间复杂度:O(n),需要额外使用长度为 ndp 数组。

还有一个二分的算法就不写了啦!dp思想好好理解就可以啦!拜拜啦!

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

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

相关文章

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现(论文7000字参考+源码+LW+部署讲解)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

多个单元运算符合用???:::

string a "a";string b "b";string c "c";string r a "a" ? b "b" ? c"c" ? "b" : "cc" : "33":"44";string rr a "a"? b "b" ?(c …

突破AI性能瓶颈 揭秘LLaMA-MoE模型的高效分配策略

获取本文论文原文PDF&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读 本文介绍了一种名为“LLaMA-MoE”的方法&#xff0c;通过将现有的大型语言模型&#xff08;LLMs&#xff09;转化为混合专家网络&#xff08;MoE&#xff09;&#xff0c;从而解决了训练MoE…

4. kvm存储虚拟化

kvm存储虚拟化 一、命令行工具管理虚拟磁盘1、查看虚拟磁盘2、添加磁盘3、删除磁盘 二、qcow2格式的磁盘文件1、创建磁盘文件2、差量镜像/快速创建虚机2.1 创建差量镜像2.2 准备配置文件2.3 创建虚拟机2.4 批量部署虚拟机 三、存储池 storage pool1、类型2、在线迁移2.1 规划后…

DNF手游攻略:云手机辅助刷副本!内置辅助工具!

DNF手游是一款备受玩家喜爱的角色扮演类游戏&#xff0c;以其独特的地下城探险和多样化的装备系统而闻名。玩家需要通过不断的挑战和升级&#xff0c;逐步增强自己的角色实力&#xff0c;最终完成各种高难度的副本任务。游戏的核心玩法包括打怪、刷装备、升级技能等。 游戏辅助…

SpringBoot源码阅读(7)——日志系统加载

SpringBoot的日志系统是在监听器中加载的。 SpringApplication的实例方法run&#xff0c;第298行。 listeners.starting(bootstrapContext, this.mainApplicationClass);最终触发了监听器LoggingApplicationListener 具体方法逻辑 private void onApplicationStartingEvent(…

LeetCode热题100刷题10:46. 全排列、78. 子集、17. 电话号码的字母组合、39. 组合总和、138. 随机链表的复制

回溯问题 46. 全排列 全排列问题&#xff1a; path 递归终止条件&#xff1a;path中是否已存储所有元素&#xff1b; for循环处理节点集合&#xff1a;used0未被使用的元素 class Solution { public:vector<int> path;vector<vector<int>> res;void backt…

【MPPT太阳能升压控制器方案】远翔升压恒流驱动芯片FP7209单节电池升压24V,30V,36V,42V,48V全系列方案,高转换效率,输出带短路保护功能

高转换效率&#xff0c;太阳能控制器方案——详解太阳能控制器PWM / MPPT极简方案其设计要点&#xff0c;升压30V&#xff0c;36V&#xff0c;42V&#xff0c;48V 使用单颗芯片FP7209即实现两级升压到30V&#xff0c;36V&#xff0c;42V&#xff0c;48V&#xff0c;相对于单极升…

RedHat运维-Ansible自动化运维基础26-管理用户与认证

1. user: 在所有受控主机上&#xff0c;新建一个用户Hello_Kitty&#xff0c;用户shell是/bin/bash&#xff0c;并将这个用户加入组wheel&#xff1b; 2. user: 在所有受控主机上&#xff0c;新建一个用户Kitty_bug&#xff0c;用户shell是/bin/bash&#xff0c;并将这个用户加…

【Python】已解决:ModuleNotFoundError: No module named ‘nltk’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ModuleNotFoundError: No module named ‘nltk’ 一、分析问题背景 在使用Python进行自然语言处理或文本分析时&#xff0c;我们经常会用到各种库来辅助我们的工…

【转】-java多线程读写锁ReadWriteLock

Java多线程中读写锁ReadWriteLock的使用 该博客转载自​**lavimer​的​Java多线程中读写锁ReadWriteLock的使用** 1. 概念 读写锁分为读锁和写锁&#xff0c;多个读锁之间是不需要互斥的(读操作不会改变数据&#xff0c;如果上了锁&#xff0c;反而会影响效率)&#xff0c;…

【OpenCV】BGR三色通道的提取与合并--超详细解读

在OpenCV中&#xff0c;处理图像时经常需要提取或合并图像的RGB&#xff08;红、绿、蓝&#xff09;三色通道。OpenCV默认使用BGR&#xff08;蓝、绿、红&#xff09;顺序来存储图像的颜色通道&#xff0c;这一点与很多图像处理库&#xff08;如PIL/Pillow&#xff09;不同&…

Android Constant expression required (case R.id.xxx)

gradle更新到8.0后&#xff0c;遇到了这个报错 有两种解决方式&#xff1a; 1、在gradle.properties中添加下面代码 android.nonFinalResIdsfalse 2、使用if-else来判断 int id view.getId(); if (id R.id.setting_iv_back) {} else if (id R.id.setting_tv_clear) {}

大数据面试题之GreenPlum(1)

目录 介绍一下GreenPlum GreenPlum属于哪家公司的产品&#xff0c;简单说下发展历史 GreenPlum如何处理大数据 GreenPlum有哪些优势 GreenPlum的缺点有哪些 如何优化GreenPlum的性能 如何监控和分析GreenPlum的性能指标 Greenplum整体架构信息 说下Master主机与Segment…

Web知识库应用程序LibreKB

什么是 LibreKB &#xff1f; LibreKB 是一款知识库 Web 应用程序。免费、开源、自托管&#xff0c;基于 PHP/MySQL。 官方并没有 Docker 镜像&#xff0c;老苏这次图省事&#xff0c;并没有像往常一样构建一个镜像&#xff0c;而是基于 Docker 搭建了一个 LAMP 环境&#xff0…

判断一个字符串中出现次数最多的字符,统计这个次数?

1、核心算法&#xff1a;利用 charAt() 遍历这个字符串 2、把每个字符都存储给对象&#xff0c;如果对象没有该属性就为1&#xff0c;如果存了就1 3、遍历对象&#xff0c;得到最大值及出现次数和该字符 let str "aozisodsdkksdsd" let obj {} for (let i 0; i &l…

ConditionalOnJndi注解使用介绍、应用场景以及示例代码

概述 ConditionalOnJndi 是 Spring Framework 中的一个条件注解&#xff0c;用于在特定的 JNDI (Java Naming and Directory Interface) 环境条件下决定是否创建一个 bean 或配置一个 bean。JNDI 是 Java EE 规范中定义的一种用于访问命名和目录服务的 API&#xff0c;它允许 …

蹭一个围棋亚军!不要和低维的人说话——早读(逆天打工人爬取热门微信文章解读)

熬夜后需要补什么呢&#xff1f; 引言Python 代码第一篇 洞见 不要和低维的人说话&#xff08;深度好文&#xff09;第二篇 冲冲冲结尾 引言 昨晚真的是熬夜又想不出东西 真的头大 最近下围棋 这个棋感很好呀 我是K级选手 目前是8级 套几个buff 纯自学 为什么决定学围棋呢? 是…

谷粒商城配置中心错误记录

文章目录 一&#xff0c;com.alibaba.nacos.api.exception.NacosException: endpoint is blank1&#xff0c;分析定位2&#xff0c;关于配置文件application和bootstrap的区别与练习加载顺序使用说明 参考文献 一&#xff0c;com.alibaba.nacos.api.exception.NacosException: …

AI工具:软件开发者的革命性助手还是潜在威胁?

近年来&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在软件开发领域掀起了一场革命。从代码生成、错误检测到自动化测试&#xff0c;AI工具正在快速改变开发者的工作方式。这些工具不仅提高了开发效率&#xff0c;还引发了关于开发者职业前景和技能需求变化的广泛讨…