备战秋招60天算法挑战,Day33

题目链接: https://leetcode.cn/problems/longest-increasing-subsequence/

视频题解: https://www.bilibili.com/video/BV1RRvheFEog/

LeetCode 300. 最长递增子序列

题目描述

给你一个整数数组nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。

举个例子:

输入: nums = [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长递增子序列是[2,3,7,101],因此长度为 4。

视频题解

最长递增子序列

思路来源

思路来源

知识回顾

动态规划是一种通过将原问题分解为子问题来求解复杂问题的算法思想。它通常用于求解最优化问题,例如最长公共子序列、背包问题等。动态规划的核心思想是将原问题分解为若干个子问题,通过求解子问题的最优解推导出原问题的最优解。可以通过两点来判断一个问题能不能通过动态规划来解,一是该问题是否存在递归结构,二是对应的子问题能否记忆化。动态规划可以通过带备忘录的自上而下的递归自下而上的迭代来分别实现。由于递归需要用到栈来实现,一些语言对递归的深度是有限制的,所以自下而上的迭代是动态规划的最佳实现方式

思路解析

下图给出了nums = [1, 4, 3]枚举最长递增子序列的过程,每个节点都是nums的一个子序列。

从上图可以看出题目其实就是要求从根节点合法节点的最长路径,其中合法节点中的数组是递增序列,绿色节点表示合法节点。

下面介绍一下动态规划的解法。

动态规划的核心步骤是推导状态转移公式边界条件处理

首先定义dp[i]表示以numsi个元素结尾的最长递增子序列的长度。

nums = [1, 4, 3]这个例子我们来看下寻找最长递增子序列的过程。

  1. 第0个元素1结尾的子序列为[1],其中递增子序列为[1],所以dp[0] = 1
  2. 第1个元素4结尾的子序列为[1, 4][4],其中递增子序列为[1, 4][4],所以dp[1] = 2
  3. 第2个元素3结尾的子序列为[1, 3][1, 4, 3][4, 3][3],其中递增子序列为[1, 3][3],所以dp[2] = 2

从上面可以看出我们在求dp[i]时,nums[i]需要和nums[0] ~ nums[i-1]进行比较,如果满足nums[i] > nums[k],那么dp[i] = max(dp[i], dp[k] + 1),其中0 <= k < i

  • 对于dp[0],很显然dp[0] = 1
  • 对于dp[1],存在nums[1] > nums[0],所以dp[1] = max(dp[1], dp[0] + 1) = 2
  • 对于dp[2],存在nums[2] > nums[0],所以dp[2] = max(dp[2], dp[0] + 1) = 2

扩展到一般情况可以得到状态转移公式

dp[n] = max{dp[0] + 1, ...,dp[i] + 1,dp[n]}

其中0 <= i < n,且nums[n] > nums[i]

接下来看下边界条件nums的每个元素都各自为一个长度为1的子序列,故可以初始定义dp[i] = 1

最终dp中最大的元素就是我们要找的答案。

C++代码

class Solution {
public:int lengthOfLIS(vector<int> & nums) {int nums_len = nums.size();//边界条件初始化vector<int> dp(nums_len, 1);for (int i = 0; i < nums_len; ++i) {for (int j = 0; j < i; ++j) {//状态转移公式if (nums[i] > nums[j]) {dp[i] = max(dp[i], dp[j] + 1);}}}return *max_element(dp.begin(), dp.end());}
};

java代码

class Solution {public int lengthOfLIS(int[] nums) {int nums_len = nums.length;int max_res = 0;// 边界条件初始化int[] dp = new int[nums_len];for (int i = 0; i < nums_len; ++i) {dp[i] = 1;max_res = Math.max(max_res, dp[i]);}for (int i = 0; i < nums_len; ++i) {for (int j = 0; j < i; ++j) {// 状态转移公式if (nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);max_res = Math.max(max_res, dp[i]);}}}return max_res;}
}

python代码

class Solution:def lengthOfLIS(self, nums: List[int]) -> int:nums_len = len(nums)# 边界条件初始化dp = [1] * nums_lenfor i in range(nums_len):for j in range(i):# 状态转移公式if nums[i] > nums[j]:dp[i] = max(dp[i], dp[j] + 1)return max(dp)

复杂度分析

时间复杂度: O(n2),其中nnums的长度。

空间复杂度: O(n), 其中nnums的长度。

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

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

相关文章

自幂数判断c++

题目描述 样例输入 3 152 111 153样例输出 F F T 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; long long m,a; int main(){cin>>m;for(int i1;i<m;i){cin>>a;long long ta,n[10],cc0,s0;while(t!0){//求位数与拆位n[cc]t%10;tt/…

多线程篇(并发相关类- 原子操作类)(持续更新迭代)

目录 前言 一、原子变量操作类&#xff08;AtomicLong为例&#xff09; 1. 前言 2. 实例 二、JDK 8新增的原子操作类LongAdder 三、LongAccumulator类原理探究 前言 JUC包提供了一系列的原子性操作类&#xff0c;这些类都是使用非阻塞算法CAS实现的&#xff0c;相比使用…

PowerShell脚本编写:自动化Windows开发工作流程实例介绍

PowerShell脚本编写&#xff1a;自动化Windows开发工作流程 大家好&#xff0c;我是吃点李子&#xff0c;今天我想和大家分享一下如何利用PowerShell脚本编写来自动化我们的日常工作流程。作为一名开发者&#xff0c;我们经常会遇到一些重复性的工作&#xff0c;比如部署环境、…

一起学习LeetCode热题100道(72/100)

72.每日温度(学习) 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例…

【每日一题】LeetCode 2379.得到K个黑块的最少涂色次数(字符串、滑动窗口)

【每日一题】LeetCode 2379.得到K个黑块的最少涂色次数&#xff08;字符串、滑动窗口&#xff09; 题目描述 给定一个字符串 blocks&#xff0c;其中每个字符代表一个颜色块&#xff0c;可以是 ‘W’&#xff08;白色&#xff09;或 ‘B’&#xff08;黑色&#xff09;。你需…

dubbo 服务消费原理分析之应用级服务发现

文章目录 前言一、MigrationRuleListener1、迁移状态模型2、Provider 端升级3、Consumer 端升级4、服务消费选址5、MigrationRuleListener.onRefer6、MigrationRuleHandler.doMigrate6、MigrationRuleHandler.refreshInvoker7、MigrationClusterInvoker.migrateToApplicationFi…

硬件工程师求职过程的启示

在技术求职过程中&#xff0c;每一次面试都是一次独特的学习经历&#xff0c;尤其是在硬件工程师的岗位中&#xff0c;面试者往往需要具备广泛的技能和灵活的适应能力。 1. 面试中的全面技能要求 在现代技术行业中&#xff0c;特别是硬件开发岗位&#xff0c;企业对工程师的要…

初识命名空间

1.创建两个命名空间 ip netns add host1 ip netns add host2 2. 查看命名空间 ip netns ls 3 、 创建veth ip -netns host1 link add veth0 type veth peer name host1-peer 4、 查看命名空间接口 ip -netns host1 address 5、 把host1-peer移动到host2命名空间 ip -ne…

ctfshow-nodejs

什么是nodejs Node.js 是一个基于 Chrome V8 引擎的 Javascript 运行环境。可以说nodejs是一个运行环境&#xff0c;或者说是一个 JS 语言解释器 Nodejs 是基于 Chrome 的 V8 引擎开发的一个 C 程序&#xff0c;目的是提供一个 JS 的运行环境。最早 Nodejs 主要是安装在服务器…

SAP B1 基础实操 - 用户定义字段 (UDF)

目录 一、功能介绍 1. 使用场景 2. 操作逻辑 3. 常用定义部分 3.1 主数据 3.2 营销单据 4. 字段设置表单 4.1 字段基础信息 4.2 不同类详细设置 4.3 默认值/必填 二、案例 1 要求 2 操作步骤 一、功能介绍 1. 使用场景 在实施过程中&#xff0c;经常会碰见用户需…

Jmeter使用时小技巧添加“泊松随机定时器“模拟用户思考时间

1、模拟用户思考时间&#xff0c;添加"泊松随机定时器"

HTML 中 a 超链接标签全解析:属性、锚点与伪类

目录 a超链接标签介绍 锚点介绍 页面内锚点 页面外锚点 伪类 a超链接标签介绍 在 HTML 中&#xff0c;<a>标签是一个文本级的标签&#xff0c;同时它还包含伪类&#xff0c;用于根据用户与链接的不同交互状态呈现不同的样式。与之同为文本级标签的<p>&#xff…

SQL Server导入导出

SQL Server导入导出 导出导入 这里已经安装好了SQL Server&#xff0c;也已经创建了数据库和表。现在想导出来给别人使用&#xff0c;所以需要导入导出功能。环境&#xff1a;SQL Server 2012 SP4 如果没有安装&#xff0c;可以查看安装教程&#xff1a; Microsoft SQL Server …

vue2.0中axios请求配置

vue2.0中axios请求配置 一、vue2.0项目中1.配置2.使用 二、vue2.0ts项目中如何配置1.配置2.使用 一、vue2.0项目中 1.配置 // axios.js import axios from axios; import { Message } from element-ui; import router from ../../router/index.js; //创建axios实例const serv…

装WebVideoCreator记录

背景&#xff0c;需要在docker容器内配置WebVideoCreator环境&#xff0c;配置npm、node.js WebVideoCreator地址&#xff1a;https://github.com/Vinlic/WebVideoCreator 配置环境&#xff0c;使用这个教程&#xff1a; linux下安装node和npm_linux离线安装npm-CSDN博客 1…

Android12上新增jar遇到的问题总结

最近在vendor目录下新增jar遇到一个问题&#xff0c;新增jar完全没问题&#xff0c;但是如果在framework/base/service下通过static_lib调用&#xff0c;就会出现如下报错&#xff0c;在SystemUI中调用都不会出现此问题&#xff0c;这个问题应该就是出现在framework/base/servi…

【C语言】---- 复合数据类型之枚举(Enum)

在C语言中&#xff0c;枚举&#xff08;Enum&#xff09;是一种用户定义的数据类型&#xff0c;它允许为一组常量分配有序的值。枚举在编程中经常用于表示一组相关的命名常量&#xff0c;提高程序的可读性和可维护性。 枚举的定义 枚举的定义使用 enum 关键字&#xff0c;它允…

反射: 获取变量类型

更高级的编程语言&#xff0c;提供反射、解释机制&#xff0c;获取对象类型非常方便&#xff0c;因为运行时保存有对象的全部信息&#xff0c;也包括类型&#xff0c;而对于编译型语言而言&#xff0c;变量类型要靠编译期或构造/依赖类型某个存储类型的结构。 不同语言的反射 …

JavaWeb - Mybatis - 基础操作

删除Delete 接口方法&#xff1a; Mapper public interface EmpMapper { //Delete("delete from emp where id 17") //public void delete(); //以上delete操作的SQL语句中的id值写成固定的17&#xff0c;就表示只能删除id17的用户数据 //SQL语句中的id值不能写成…

[数据集][目标检测]西红柿成熟度检测数据集VOC+YOLO格式3241张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3241 标注数量(xml文件个数)&#xff1a;3241 标注数量(txt文件个数)&#xff1a;3241 标注…