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

news2024/9/30 2:43:31

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) {
        // 如果数组为空,则最长递增子序列的长度为0
        if(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.coloradmin.cn/o/1913505.html

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

相关文章

vmware 虚拟机扩容 centos 硬盘扩容 kylinos v10扩容

1. 虚拟机先扩容 1.1 关机&#xff0c;并点击系统&#xff0c;让他是点选状态&#xff0c;但是没开机 1.2 右击&#xff0c;点击最下方设置&#xff0c;点击硬盘 1.3 点击扩展磁盘 1.4 选择你需要扩容的大小&#xff0c;数字为总大小 完成提示&#xff1a; 磁盘已成功扩展。您…

溶解氧(DO)理论指南(2)

转载自梅特勒官网资料&#xff0c;仅用于学习交流&#xff0c;侵权则删&#xff01; 溶解氧理论指南 2 DO电极类型2.1 氧化还原化学简介2.2 原电池法溶解氧电极2.3 极谱法溶解氧电极2.3 光学法溶解氧电极 2 DO电极类型 O2是一种高活性分子&#xff0c;因为它是通过光合作用连…

linux信息收集与提权

目录 版本信息收集 kali得一些exp网站 kali自带的searchsploit工具 脏牛提权漏洞&#xff08;改写没有写权限的文件&#xff09; 测试靶场下载链接 sudo提权 上传恶意C脚本进行编译生成dirty的elf文件&#xff0c;也可以在攻击机编译好上传 启动&#xff0c;123456是设…

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

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

vue和react你怎么选择?

在选择Vue和React之间&#xff0c;其实没有一个绝对的“最佳选择”&#xff0c;因为这取决于你的项目需求、团队熟悉度、开发环境、以及你对这两个框架的个人偏好。下面是一些可以帮助你做出决策的因素&#xff1a; 1. 学习曲线 Vue&#xff1a;Vue的学习曲线相对平缓&#xf…

文件上传漏洞:upload-labs靶场安装和实践

一、upload-labs靶场安装 安装&#xff1a;Windows下的Upload-labs环境搭建(Upload文件夹不存在报错&#xff09;_upload-labs文件夹不存在-CSDN博客 当安装好phpstudy之后&#xff0c;在网址栏输入&#xff1a;localhost或127.0.0.1&#xff0c;如果没问题&#xff0c;就将下…

RFID智能锁控系统在物流安全运输中的应用与效益分析

一、物流锁控系统现状与挑战 1.1 传统锁控系统的局限性 安全性不足&#xff1a;机械锁容易被撬开或钥匙被复制&#xff0c;导致货物在运输过程中面临被盗风险。 无法实时追踪&#xff1a;一旦货物离开发货点&#xff0c;物流公司无法实时监控货物状态&#xff0c;增加了货物…

Elasticsearch:Node.js ECS 日志记录 - Morgan

这是之前系列文章&#xff1a; Elasticsearch&#xff1a;Node.js ECS 日志记录 - Pino Elasticsearch&#xff1a;Node.js ECS 日志记录 - Winston 中的第三篇文章。在今天的文章中&#xff0c;我将描述如何使用 Morgan 包针对 Node.js 应用进行日子记录。此 Morgan Node.j…

无法找到模块“@wangeditor/editor-for-vue”的声明文件

vue3项目中使用wangeditor/editor遇到的问题 开发环境不管红线报错正常使用 打包的时候就会报错了 1.安装依赖 pnpm install --save wangeditor/editor wangeditor/editor-for-vuenext 2.遇到的问题 3.解决方法 在src目录下面创建 wangeditor-types.d.ts 文件 代码如下 de…

【单片机毕业设计选题24054】-基于STM32的水质检测系统

系统功能: 主要功能模块原理图: 电源时钟烧录接口: 单片机和按键输入电路: 传感器采集电路&#xff1a; 资料获取地址 系统主要功能模块代码 初始化代码: /* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration-----------------------------------------------…

最大数值00

题目链接 最大数值 题目描述 注意点 不得使用if-else或其他比较运算符 解答思路 本题直接比较大小非常简单&#xff0c;但是题目要求不得使用if-else或其他比较运算符&#xff0c;可以先将a与b相减&#xff0c;再右移获得其符号位&#xff0c;根据符号位是0还是-1返回相应…

【以史为镜、以史明志,知史爱党、知史爱国】中华上下五千年之-唐朝

唐朝&#xff08;618年—907年&#xff09;&#xff0c;是继隋朝之后的大一统中原王朝&#xff0c;共历二十一帝&#xff0c;享国二百八十九年。 隋末天下群雄并起&#xff0c;617年 唐国公李渊于晋阳起兵&#xff0c;次年称帝建立唐朝&#xff0c;定都长安。 唐太宗继位后开创…

【吊打面试官系列-MyBatis面试题】简述 Mybatis 的插件运行原理,以及如何编写一个插件?

大家好&#xff0c;我是锋哥。今天分享关于 【简述 Mybatis 的插件运行原理&#xff0c;以及如何编写一个插件?】面试题&#xff0c;希望对大家有帮助&#xff1b; 简述 Mybatis 的插件运行原理&#xff0c;以及如何编写一个插件? Mybatis 仅可以编写针对 ParameterHandler、…

About CAT7验证——CLASS F或者Fa测试FLUKE解决方案

七类CLASS F线缆认证测试标准在TIA的标准数据库中是直接跳过&#xff0c;取而代之的是八类的通道测试标准&#xff0c;真正认证七类测试的是在ISO标准数据库中&#xff0c;找到ISO11801 CHANNEL CLASS F或者FA&#xff0c;这就是标准的七类测试标准&#xff0c;测试频率需要达到…

【以史为镜、以史明志,知史爱党、知史爱国】中华上下五千年之-隋朝

隋朝&#xff08;581年-619年&#xff09;是中国历史上承南北朝、下启唐朝的大一统王朝。 581年&#xff0c;杨坚定国号为“隋”&#xff0c;定都大兴城&#xff0c;随后南下灭陈朝&#xff0c;统一中国&#xff0c;结束了自西晋末年以来长达近300年的分裂局面。 杨坚&#xff…

在树莓派设备上导出系统镜像

镜像导出 前提条件&#xff1a; 已获取可以正常使用的设备。已获取鼠标、键盘和电源适配器。已将设备接入可正常使用的网络。 操作步骤&#xff1a; 连接适配器给设备上电&#xff0c;正常启动设备&#xff0c;连接鼠标和键盘。在终端命令窗格执行如下命令&#xff0c;安装…

您的《嵌入式系统设计中级工程师》证书待领取,点击查看!

在技术日新月异的今天&#xff0c;每一份专业认证都是个人专业能力的有力证明。近期&#xff0c;中国电子学会新一轮《嵌入式系统设计中级工程师-嵌入式裸机编程》专业技术证书的相关认证考试已圆满结束&#xff0c;最新一批证书已全部发放&#xff01; ▋ 证书介绍 嵌入式技术…

ES6:JavaScript开发者的速成手册(二)

目录 前言Reflect APIProxyProxy 与 defineProperty 的区别 SymbolsGeneratorsgenerator处理异步代码 PromiseAsyncModuleAPI介绍 前言 本教程将分为两大部分深入解读ES6的精髓。将带你领略ES6的基础语法&#xff0c;将深入探讨ES6的高级特性&#xff0c;通过浅显易懂的语言和大…

视频压缩文件太大了怎么缩小?3个压缩方法分享

视频压缩文件太大了怎么缩小&#xff1f;当视频压缩文件过大时&#xff0c;缩小其大小不仅能节省宝贵的存储空间&#xff0c;还能显著提升文件传输速度&#xff0c;特别是在网络条件有限的情况下。通过专业的视频压缩软件&#xff0c;可以有效减少文件体积&#xff0c;使视频内…

五分钟带你学会Vant 4的使用

前言 本章将从零开始讲解vant组件库的使用方法 对小白极其友好&#xff0c;主打的就是一个读者就是上帝&#xff0c;你只管张嘴&#xff0c;我把饭嚼碎了喂给你&#xff08;坏笑&#xff09; 那我们就直接开始吧&#xff01;&#xff01;&#xff01; 效果展示 登录页面展…