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

代码随想录第二十四天|动态规划(8)

目录

LeetCode 300. 最长递增子序列

LeetCode 674. 最长连续递增序列

LeetCode 718. 最长重复子数组

LeetCode 1143. 最长公共子序列

LeetCode 1035. 不相交的钱

LeetCode 53. 最大子序和

LeetCode 392. 判断子序列

总结


LeetCode 300. 最长递增子序列

题目链接:LeetCode 300. 最长递增子序列

思想:依然用动归五部曲来分析,第一个dp数组的定义。这里把dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度。在做递增比较的时候,比较两个子序列的结尾才能算递增,比较完一个再比较结尾也可以保证是递增的。其次就是状态转移方程,位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列+1的最大值。所以状态转移方程是if(nums[i] > nums[j]) dp[i]=max(dp[i],dp[j]+1)。初始化就把dp数组全初始化为1,因为本身也是一个子序列。这里有两层循环,先从前往后遍历整个nums数组,内层遍历就从前往后遍历到外层下标-1就行了。

代码如下:

    int lengthOfLIS(vector<int>& nums) {if (nums.size() == 1) return 1;vector<int> dp(nums.size(), 1);int result = 0;for (int i = 1; i < nums.size(); i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);}result = dp[i] > result ? dp[i] : result;}return result;}

时间复杂度:O(n^2),空间复杂度:O(n)。

LeetCode 674. 最长连续递增序列

题目链接:LeetCode 674. 最长连续递增序列

思想:本题跟上题基本上情况都是一模一样的,除了子序列变成了连续连续,也就是说任何递增序列的元素在原数组必须要相邻。那么把上述循环中的if判断条件修改了就行,改为if(dp[j+1]>dp[j])然后再进行状态判断,如果不满足递增的话,dp[i]就等于1就行了,因为要重新进行计算。

代码如下:

    int findLengthOfLCIS(vector<int>& nums) {if (nums.size() == 1) return 1;vector<int> dp(nums.size(), 1);int result = 0;for (int i = 1; i < nums.size(); i++) {for (int j = 0; j < i; j++) {if (nums[j+1] > nums[j]) dp[i] = max(dp[i], dp[j]+1);else dp[i] = 1;}result = dp[i] > result ? dp[i] : result;}return result;}

时间复杂度:O(n^2),空间复杂度:O(n)。

LeetCode 718. 最长重复子数组

题目链接:LeetCode 718. 最长重复子数组

思想:本题没有强调连续的话,子数组就相当于子序列。那么还是动归五部曲,第一个确定dp[i]。dp[i][j]是以下标i-1为结尾的A和下标j-1为结尾的B,最长重复子数组长度为dp[i][j]。第二个就是确定递推公式,dp[i][j]需要i-1和j-1的状态推导出来,那么当A[i-1]=B[j-1]的时候,dp[i][j] = dp[i-1][j-1]+1。初始化的话就把每一个初始化为0就行了,循环就外层遍历一个数组,内层遍历另一个数组就可以了。

代码如下:

    int findLength(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>> dp(nums1.size()+1, vector<int>(nums2.size()+1, 0));int result = 0;for (int i = 1; i <= nums1.size(); i++) {for (int j = 1; j <= nums2.size(); j++) {if (nums1[i-1] == nums2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;result = dp[i][j] > result ? dp[i][j] : result;}}return result;}

时间复杂度:O(n^2),空间复杂度:O(n^2)。

LeetCode 1143. 最长公共子序列

题目链接:LeetCode 1143. 最长公共子序列

思想:其实本题跟上题是差不多的,主要差别就是递推公式上,相等的就是一样的递推公式,这里存在着不等,不等的话就看i-1和j-1状态上的数值谁大,谁大就取谁。即dp[i][j] = max(dp[i-1][j], dp[i][j-1]。

代码如下:

    int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size()+1, vector<int> (text2.size()+1, 0));int result = 0;for (int i = 1; i <= text1.size(); i++) {for (int j = 1; j <= text2.size(); j++) {if (text1[i-1] == text2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;else dp[i][j] = max(dp[i][j-1], dp[i-1][j]);result = dp[i][j] > result ? dp[i][j] : result;}}return result;}

时间复杂度:O(n^2),空间复杂度:O(n^2)。

LeetCode 1035. 不相交的钱

题目链接:LeetCode 1035. 不相交的钱

思想:本题跟上题一模一样。遂不再重复。

代码如下:

    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>> dp(nums1.size()+1, vector<int>(nums2.size()+1, 0));int result = 0;for (int i = 1; i <= nums1.size(); i++) {for (int j = 1; j <= nums2.size(); j++) {if (nums1[i-1] == nums2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);result = dp[i][j] > result ? dp[i][j] : result;}}return result;}

时间复杂度:O(n^2),空间复杂度:O(n^2)。

LeetCode 53. 最大子序和

题目链接:LeetCode 53. 最大子序和

思想:还是动归五部曲吧,第一步确定dp数组。这里dp[i]表示包括下标i的最大连续子序列和dp[i]。其次就是递推公式,dp[i]只有两个方向可以推出来:第一个状态当前nums[i]加入子序列即dp[i] = dp[i-1] + nums[i];第二个状态是重新开始计算子序列即dp[i] = nums[i]。这俩个状态取最大就行了。初始化只需要初始化dp[0]就行了,dp[0]很明显要等于nums[0]。遍历顺序就直接从前往后遍历就行了。

代码如下:

    int maxSubArray(vector<int>& nums) {if (nums.size() == 1) return nums[0];vector<int> dp(nums.size(), INT_MIN);dp[0] = nums[0];int result = dp[0];for (int i = 1; i < nums.size(); i++) {dp[i] = max(dp[i-1] + nums[i], nums[i]);result = dp[i] > result ? dp[i] : result;}return result;}

时间复杂度:O(n),空间复杂度:O(n)。

LeetCode 392. 判断子序列

题目链接:LeetCode 392. 判断子序列

思想:本题其实跟判断最长子序列是一个道理,只需最后判断得出的长度是否等于s的长度就行了。遂不再讲解了。

代码如下:

    bool isSubsequence(string s, string t) {if (s.size() > t.size()) return false;vector<vector<int>> dp(s.size()+1, vector<int> (t.size()+1, 0));for (int i = 1; i <= s.size(); i++) {for (int j = 1; j <= t.size(); j++) {if (s[i-1] == t[j-1]) dp[i][j] = dp[i-1][j-1] + 1;else dp[i][j] = max(dp[i][j-1], dp[i-1][j]);}}if (dp[s.size()][t.size()] == s.size()) return true;return false;}

时间复杂度:O(n^2),空间复杂度:O(n^2)。

总结

我还是不会!!!

相关文章:

代码随想录第二十四天|动态规划(8)

目录 LeetCode 300. 最长递增子序列 LeetCode 674. 最长连续递增序列 LeetCode 718. 最长重复子数组 LeetCode 1143. 最长公共子序列 LeetCode 1035. 不相交的钱 LeetCode 53. 最大子序和 LeetCode 392. 判断子序列 总结 LeetCode 300. 最长递增子序列 题目链接&#…...

编程-设计模式 3:单例模式

设计模式 3&#xff1a;单例模式 定义与目的 定义&#xff1a;单例模式确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。目的&#xff1a;这种模式通常用于那些需要频繁访问且只需一个实例的对象&#xff0c;例如配置管理器、日志记录器等。 实现示例…...

Kaniko 构建 Docker 镜像

Kaniko 主要用于构建 Docker 镜像&#xff0c;而不是运行程序。它的主要用途是从 Dockerfile 构建容器镜像&#xff0c;但它并不负责运行容器或程序。以下是 Kaniko 的主要功能和局限性&#xff1a; 主要功能 构建镜像&#xff1a;Kaniko 从 Dockerfile 构建容器镜像。它通过…...

Javascript常见算法(每日两个)

合并两个有序链表 在JavaScript中&#xff0c;合并两个有序链表通常指的是将两个已经按照某种顺序&#xff08;如升序或降序&#xff09;排列的链表合并成一个新的有序链表。由于JavaScript本身不直接支持链表数据结构&#xff0c;我们通常会用对象或数组来模拟链表的行为。但…...

Spring -- 事务

Spring中事务的操作分为两类:(1)编程式事务 – 手动写代码操作事务(2)声明式事务 – 利用注解开启事务和提交事务 1. 编程式事务 准备Controller RestController RequestMapping("/user") public class UserInfoController {Autowiredprivate UserInfoService use…...

生命密码的破译者:AI如何学会读懂DNA语言?

引言 如果能像解读一本神秘的书籍那样&#xff0c;理解DNA的“语言”&#xff0c;将是多么令人兴奋的科学突破&#xff01;如今&#xff0c;这正在逐步变为现实。科学家们训练出的AI模型GROVER正如一个勤奋的学生&#xff0c;学习着DNA的每一个“单词”和“语法”&#xff0c;…...

大数据信用报告查询哪家平台的比较好?

相信在搜索大数据信用的你&#xff0c;已经因为大数据信用不好受到了挫折&#xff0c;想详细了解一下自己的大数据信用&#xff0c;但是找遍了网络上的平台之后才发现&#xff0c;很多平台都只提供查询服务&#xff0c;想要找一个专业的平台查询和讲解很困难。下面本文就为大家…...

Java高级Day24-集合最后补充

75.HashTable 基本介绍&#xff1a; 存放元素的健值对 即K-V hashtable的键和值都不能为null&#xff0c;否则会抛出NullPointerException hashtable使用方法基本上和HashMap一样 hashtable是线程安全的&#xff0c;hashmap是线程不安全 扩容机制&#xff1a; 底层有数组…...

C++入门:C语言到C++的过渡

前言&#xff1a;C——为弥补C缺陷而生的语言 C起源于 1979 年&#xff0c;当时 Bjarne Stroustrup 在贝尔实验室工作&#xff0c;面对复杂软件开发任务&#xff0c;他感到 C 语言在表达能力、可维护性和可扩展性方面存在不足。 1983 年&#xff0c;Bjarne Stroustrup 在 C 语言…...

了解MVCC

概念 MVCC&#xff0c;全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;是一种并发控制的方法&#xff0c;维护一个数据的多个版本&#xff0c;使得读写操作没有冲突&#xff0c;快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现…...

WPF自定义控件的应用(DynamicResource的使用方法)

1 DynamicResource的使用方法 可以在字典文件 的抬头区写入数&#xff1a; <SolidColorBrush x:Key"PrimaryBackgroundColor" Color"#FFABAdB3"/><SolidColorBrush x:Key"TextBox.MouseOver.Border" Color"#FF7EB4EA"/>&l…...

Postgresql数据库密码忘记的解决

当您忘记PostgreSQL数据库的密码时,可以通过以下步骤来重置密码。这些步骤在Windows和Linux操作系统上大体相同,但具体操作路径和命令可能有所不同。 步骤一:找到并修改pg_hba.conf文件 定位安装目录: Windows:通常在PostgreSQL的安装目录下的data文件夹中。Linux:位置可…...

Flink SQL 基础操作

Flink SQL是建立在Apache Flink之上的SQL处理引擎&#xff0c;它允许用户以SQL的方式处理流数据和批数据。以下是一些Flink SQL的基础操作&#xff1a; 一、环境准备 1.启动flink集群 ./start-cluster.sh启动sql-client ./sql-client.sh二、数据源定义 创建表&#xff08;…...

海思AE模块Lines_per_500ms参数的意义

​ 基础知识 1秒(S)1000毫秒(ms)1000_000微妙(s)1000_000_000纳秒(ns) 1GHz1000Mhz1000_000KHz1000_000_000Hz 1Hz1/s 抗频闪原理 海思AE模块参数中有一个LinesPer500ms的参数&#xff0c;意思为500ms对应的曝光行数。此个参数和抗频闪有关。 我们知道&#xff1a; 50HZ…...

【代码随想录】区间和——前缀和方法

本博文为《代码随想录》学习笔记&#xff0c;原文链接&#xff1a;代码随想录 题目 原题链接&#xff1a;58. 区间和&#xff08;第九期模拟笔试&#xff09; 题目描述 给定一个整数数组 Array&#xff0c;请计算该数组在每个指定区间内元素的总和。 输入描述 第一行输入为…...

Bug 解决 | 前端项目无法正确安装依赖?

目录 1、网络问题 2、权限问题 3、版本冲突 4、缓存问题 5、依赖配置错误 6、系统环境问题 前端项目和后端项目一样&#xff0c;都需要用到很多第三方的类库依赖。目前基本上我们主流的前端项目都使用 Npm、Yarn 等包管理工具来管理项目依赖&#xff0c;正常情况下通过执…...

【mysql 第四篇章】bin log 的作用是啥呢?

一、redo Log 介绍 redo log 是一种偏向物理性质的重做日志&#xff0c;因为他里面记录类似的这样的东西&#xff0c;“对那个数据也中的什么记录&#xff0c;做了个什么修改”。它是 InnoDB 存储引擎特有的东西。 二、bin Log 日志 bin log 叫做归档日志&#xff0c;它里面…...

Linux 操作系统:基于环形队列的生产者消费者模型

Linux 操作系统&#xff1a;基于环形队列的生产者消费者模型 一、前言二、大致框架二、P操作、V操作三、生产者生产数据四、生产者获取数据五、代码测试六、所有代码 一、前言 环形队列采用数组模拟&#xff0c;用模运算来模拟环状特性。和基于阻塞队列的生产者消费者模型不同的…...

python求解二次方程

为了找到x和y之间的关系&#xff0c;并假设这种关系是一个二次函数&#xff0c;我们可以使用numpy的polyfit函数来拟合一个二次方程&#xff08;即形式为y ax^2 bx c的方程&#xff09;。然后&#xff0c;我们可以使用matplotlib来绘制散点图&#xff0c;并在图上添加最佳拟…...

Spring框架面试总结

Spring基础 什么是spring框架 Spring 框架是一个用于构建企业级 Java 应用程序的开源框架。【Java项目快速构建轻量级框架】我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地协助我们进行开发。【根据模…...

Ostrakon-VL-8B构建智能相册:基于自然语言的照片检索与回忆生成

Ostrakon-VL-8B构建智能相册&#xff1a;基于自然语言的照片检索与回忆生成 你有没有过这样的经历&#xff1f;手机里存了几千张照片&#xff0c;想找一张去年夏天在山上拍的照片&#xff0c;却要翻上十几分钟&#xff0c;甚至最后也没找到。或者&#xff0c;看着一堆旅行照片…...

Phi-4-mini-reasoning效果展示:高精度数学题求解与逻辑推导实测

Phi-4-mini-reasoning效果展示&#xff1a;高精度数学题求解与逻辑推导实测 1. 模型核心能力概览 Phi-4-mini-reasoning是一款专注于推理任务的文本生成模型&#xff0c;在数学解题和逻辑分析方面展现出惊人的能力。与通用聊天模型不同&#xff0c;它专为多步推理和精确结论而…...

无源光网络-PON

一、无源光网络-PON简介1.1 无源光网络定义无源光网络&#xff08;PON&#xff09; 是一种点到多点的光纤接入技术&#xff0c;全程采用无源光器件&#xff08;光分路器、光纤、光接头等&#xff0c;无电源、无电子电路&#xff09;实现信号传输。1.2 核心要点1.2.1 特点无源&a…...

如何快速掌握时空聚类:面向数据分析师的ST-DBSCAN终极指南

如何快速掌握时空聚类&#xff1a;面向数据分析师的ST-DBSCAN终极指南 【免费下载链接】st_dbscan ST-DBSCAN: Simple and effective tool for spatial-temporal clustering 项目地址: https://gitcode.com/gh_mirrors/st/st_dbscan 时空数据分析正成为现代数据科学的重…...

UE5蓝图 沿着路径移动

...

intv_ai_mk11新手避坑指南:注意事项与使用技巧全解析

intv_ai_mk11新手避坑指南&#xff1a;注意事项与使用技巧全解析 1. 快速了解intv_ai_mk11对话机器人 intv_ai_mk11是一款基于7B参数Llama架构的AI对话助手&#xff0c;运行在GPU服务器上。它能帮助你完成各种任务&#xff0c;从知识问答到内容创作&#xff0c;是提升工作效率…...

OpenClaw跨平台控制:千问3.5-9B远程操作家中电脑

OpenClaw跨平台控制&#xff1a;千问3.5-9B远程操作家中电脑 1. 为什么需要远程控制家中电脑&#xff1f; 去年冬天的一个深夜&#xff0c;我正躺在异地酒店的床上&#xff0c;突然想起家里电脑上还有个未完成的报表需要提交。如果按照传统方式&#xff0c;我可能需要麻烦家人…...

Kafka Connect管理指南:使用可视化工具简化数据同步与集群监控

Kafka Connect管理指南&#xff1a;使用可视化工具简化数据同步与集群监控 【免费下载链接】akhq Kafka GUI for Apache Kafka to manage topics, topics data, consumers group, schema registry, connect and more... 项目地址: https://gitcode.com/gh_mirrors/ak/akhq …...

5分钟掌握D3KeyHelper:暗黑3玩家的智能按键助手

5分钟掌握D3KeyHelper&#xff1a;暗黑3玩家的智能按键助手 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑破坏神3中复杂的技能循环而手忙…...

CSS 网格容器:全面解析与最佳实践

CSS 网格容器:全面解析与最佳实践 引言 CSS 网格布局(CSS Grid Layout)是 CSS3 中的一项重要特性,它允许开发者以更加灵活和高效的方式对页面布局进行设计。相较于传统的布局方式,CSS 网格布局提供了更为丰富的布局选项和更好的兼容性。本文将全面解析 CSS 网格容器,并…...