【动态规划】子数组系列(二)

📝前言说明:

  • 本专栏主要记录本人的动态规划算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

你可以点击下方链接,进行不同专题的动态规划的学习

点击链接开始学习
斐波那契数列模型路径问题
简单多状态(一)简单多状态(二)
子数组系列(一)子数组系列(二)
子序列问题(一)子序列问题(二)
回文串问题两个数组dp问题(一)
两个数组的dp问题(二)01背包问题
完全背包二维的背包问题
其他

题目

  • 413. 等差数列划分
    • 个人解
  • 978. 最长湍流子数组
    • 个人解
    • 优质解
  • 139. 单词拆分
    • 优质解
  • 467. 环绕字符串中唯一的子字符串
    • 个人解
    • 优质解


413. 等差数列划分

题目链接:https://leetcode.cn/problems/arithmetic-slices/description/
在这里插入图片描述

个人解

思路:

  • 不解释了,比较简单
  • 要注意的是:对于一个以i结尾的子数组,如果以起始位置没变,改成以i + 1结尾,则这时候子数组总数 + 1

用时:12:00
屎山代码:

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();vector<int> dp(n, 0);for(int i = 2; i < n; i++){if(dp[i - 1] > 0 && nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2])dp[i] = dp[i - 1] + 1; // else if(nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2])dp[i] = 1;}int ans = 0;for(auto x: dp)ans += x;return ans;}
};

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


978. 最长湍流子数组

题目链接:https://leetcode.cn/problems/longest-turbulent-subarray/description/
在这里插入图片描述

个人解

思路:

  • 麻烦点在于,要处理==的情况

用时:25:00
屎山代码(写的太丑陋了):

class Solution {
public:int maxTurbulenceSize(vector<int>& nums) {int n = nums.size();vector<int> dp(n, 1);if(n == 1) return 1;if(n == 2 && nums[1]!= nums[0]) return n;if(n == 2 && nums[1] == nums[0]) return 1;// 初始化bool flag1 = nums[1] - nums[0] > 0? true : false;bool flag2 = nums[2] - nums[1] > 0? true : false;if(nums[2] == nums[1])dp[2] = 1;else if(nums[1] == nums[0])dp[2] = 2;else dp[2] = flag1 != flag2? 3: 2;int ans = dp[2];for(int i = 3; i < n ; i++){if(nums[i] == nums[i - 1])continue;dp[i] = 2;if(nums[i - 1] == nums[i - 2])continue;flag1 = nums[i] - nums[i - 1] > 0? true : false;flag2 = nums[i - 1] - nums[i - 2] > 0? true : false;if(flag1 == flag2)continue;if(dp[i - 1] > 2)dp[i] = dp[i - 1] + 1;elsedp[i] = 3;}for(auto x: dp)ans = max(ans, x);return ans;}
};

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


优质解

  • 一个湍流子数组,以i位置为结尾可以分成两种状态> / <
  • 利用多状态的状态转移来填dp

代码(力扣官方题解):

class Solution {
public:int maxTurbulenceSize(vector<int>& arr) {int n = arr.size();vector<vector<int>> dp(n, vector<int>(2, 1));dp[0][0] = dp[0][1] = 1;for (int i = 1; i < n; i++) {if (arr[i - 1] > arr[i]) {dp[i][0] = dp[i - 1][1] + 1;} else if (arr[i - 1] < arr[i]) {dp[i][1] = dp[i - 1][0] + 1;}}int ret = 1;for (int i = 0; i < n; i++) {ret = max(ret, dp[i][0]);ret = max(ret, dp[i][1]);}return ret;}
};

139. 单词拆分

题目链接:https://leetcode.cn/problems/word-break/description/
在这里插入图片描述


优质解

思路:

  • dp[i]s[0 , i]这部分子串,能否被字典中的单词拼接而成
    • 我们怎么利用dp[i - 1]呢(前面的信息记录的是前面的字符串能否被字典中的单词拼接而成)
    • 也就是说:我们可以把[0, i]分成两份,[j, i]记录最后一个单词(完整的)
    • 如果[j, i]的单词在字典中,且[0, j - 1]这部分能被字典拼接而成,则i位置就行。巧妙用到的dp[j]
  • 状态转移方程:j遍历[0, i](即得到i结尾的最后一个单词)
    • 如果,dp[j - 1] == true && s[j, i] in wordDicttrue
    • 否则,false
  • 初始化:j会越界,添加一个哨兵节点。那此时字符串的下标和数组不对应了,所以我们可以在字符串前面也加多一个字符串。且dp[0] = true
  • 填表顺序:从左往右
  • 返回值:dp[n]

代码:

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordDictset; // 转换成哈希表,后续使用find方便for(auto word:wordDict){wordDictset.insert(word);}s = '0' + s;int n = s.size();vector<bool> dp(n + 1, false);dp[0] = true;for(int i = 1; i <= n; i++){for(int j = i; j >= 1; j--) // 选择从后往前{if(dp[j - 1] && wordDictset.find(s.substr(j, i - j + 1)) != wordDictset.end()){dp[i] = true;break;}}}return dp[n];}
};

467. 环绕字符串中唯一的子字符串

题目链接:https://leetcode.cn/problems/unique-substrings-in-wraparound-string/description/
在这里插入图片描述

个人解

思路:

  • dp[i]:以 i 结尾的子串是否在 base 中出现
  • 状态转移:如果dp[i - 1] > 1 && (s[i] == s[i - 1] + 1 || s[i] == s[i - 1] - 25) // 回绕到 z
    • 则 dp[i] = dp[i - 1] + 1
  • 重复子串怎么处理呢???

优质解

思路:

  • 对于这种子串问题,我们可以以最后一个位置为结尾,把子串的状态专业给区分出来,如:单独最后一个位置 / 前 i - 1的子串 + 最后一个位置
  • 返回值是重难点
  • 对于重复的子串,长的子串一定包含短的子串的所有子串
  • 所以,我们可以遍历dp表,对于相同的字符的dp值,只添加大的

代码:

class Solution {
public:int findSubstringInWraproundString(string s) {int n = s.size();int dp_max[26] = {0}; // 记录每个字符出现的子串的最大值vector<int> dp(n, 1); // 单个字符,dp[i] == 1dp_max[s[0] - 'a'] = 1;for(int i = 1; i < n; i++){if(s[i] == s[i - 1] + 1 || s[i] == s[i - 1] - 25)dp[i] += dp[i - 1];dp_max[s[i] - 'a'] = max(dp_max[s[i] - 'a'], dp[i]); // 更新字符对应的子串最大值}int ans = 0;for(auto x: dp_max)ans += x;return ans;}
};

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


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

68元开发板,开启智能硬件新篇章——明远智睿SSD2351深度解析

在智能硬件开发领域&#xff0c;开发板的选择至关重要。它不仅关系到项目的开发效率&#xff0c;还直接影响到最终产品的性能与稳定性。而今天&#xff0c;我要为大家介绍的这款明远智睿SSD2351开发板&#xff0c;仅需68元&#xff0c;却拥有远超同价位产品的性能与功能&#x…

篇章六 数据结构——链表(二)

目录 1. LinkedList的模拟实现 1.1 双向链表结构图​编辑 1.2 三个简单方法的实现 1.3 头插法 1.4 尾插法 1.5 中间插入 1.6 删除 key 1.7 删除所有key 1.8 clear 2.LinkedList的使用 2.1 什么是LinkedList 5.2 LinkedList的使用 1.LinkedList的构造 2. LinkedList的…

删除队列中整数

给定一个长度为N的整数数列A_1,A_2,...,A_N&#xff0c;请重复以下操作K次。 每次选择数列中最小的整数&#xff08;如果最小值不止一个&#xff0c;选择最靠前的&#xff09;&#xff0c;将其删除&#xff0c;并把与它相邻的整数加上被删除的数值。 请问K次操作后的序列是什…

[神经网络]使用olivettiface数据集进行训练并优化,观察对比loss结果

结合归一化和正则化来优化网络模型结构&#xff0c;观察对比loss结果 搭建的神经网络&#xff0c;使用olivettiface数据集进行训练&#xff0c;结合归一化和正则化来优化网络模型结构&#xff0c;观察对比loss结果 from sklearn.datasets import fetch_olivetti_faces #倒入数…

算法分析·回溯法

回溯法 方法概述算法框架问题实例TSP 问题n皇后问题 回溯法效率分析 方法概述 回溯法是一个既带有系统性又带有跳跃性的搜索算法&#xff1b; **系统性&#xff1a;**它在包含问题的所有解的解空间树中&#xff0c;按照深度优先的策略&#xff0c;从根结点出发搜索解空间树。…

Golang分布式系统开发实践指南

Golang分布式系统开发实践指南 一、为什么选择Golang&#xff1f; ​原生并发模型​ Goroutine和Channel机制天然适合分布式系统的并发需求​高性能编译​ 静态编译生成二进制文件&#xff0c;部署简单&#xff0c;内存占用低​丰富生态​ Go Module管理、标准库支持HTTP/2、…

基于stm32风速风向温湿度和瓦斯检测(仿真+代码)

资料下载地址&#xff1a;基于stm32风速风向温湿度和瓦斯检测 一、项目功能 1.风速&#xff0c;风向&#xff0c;温湿度&#xff0c;瓦斯&#xff0c;报警。 2.可以设置温湿度&#xff0c;瓦斯&#xff0c;风速报警阈值。 3.数据上传到云平台。 二、仿真图 三、程序 #inc…

桃黑黑反斗战

1.编写求解Hanoi汉诺塔的递归算法代码&#xff0c;输出移动过程&#xff0c;并统计总移动次数。 对不同规模的汉诺塔&#xff0c;给出测试的结果 #include <stdio.h> #include <time.h> int moveCount 0; void hanoi(int n,char source,char auxiliary,char targ…

react-native的token认证流程

在 React Native 中实现 Token 认证是移动应用开发中的常见需求&#xff0c;它用于验证用户的身份并授权其访问受保护的 API 资源。 Token 认证的核心流程&#xff1a; 用户登录 (Login): 用户在前端输入用户名和密码。前端将这些凭据发送到后端 API。后端验证凭据。如果验证成…

Dify:详解 docker-compose.yaml配置文件

详解 docker-compose.yaml 配置文件 docker-compose.yaml 是用于定义和运行多容器 Docker 应用的配置文件。下面&#xff0c;我们将详细解释您提供的 docker-compose.yaml 文件&#xff0c;包括各个服务的作用、配置&#xff0c;以及它们与 .env 文件之间的关系。 文件概览 自…

Python基于Django的主观题自动阅卷系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

今日行情明日机会——20250528

上证指数缩量收小阴线&#xff0c;个股跌多涨少&#xff0c;总体情绪偏差&#xff0c;注意风险为主。 深证指数&#xff0c;缩量收小阴线&#xff0c;连续5天阴线&#xff0c;明后天反弹的概率增大&#xff0c;但仍要注意风险。 2025年5月28日涨停股主要行业方向分析 1. 无人…

基于stm32LORA无线抄表系统仿真

资料下载地址&#xff1a;基于stm32LORA无线抄表系统仿真 1、项目介绍 基于LoRa的无线通信的电力抄表系统&#xff0c;采集节点数据&#xff0c;通过LoRa无线通信进行数据传输&#xff0c;最后再网关节点上显示。 2、仿真图 3、仿真代码 #include "oled.h" #incl…

不同电脑同一个网络ip地址一样吗

不同电脑在连接同一个WiFi时&#xff0c;它们的IP地址会相同吗&#xff1f;相信不少朋友都对这个问题感到好奇&#xff0c;今天我们就来详细探讨一下。 一、基础概念&#xff1a;IP地址的本质与分类 IP地址是分配给网络设备的唯一标识符&#xff0c;用于在互联网或局域网中定位…

CentOS 7 下 Redis 从 5.0 升级至 7.4.3 全流程实践

目录 前言1 查看 Redis 运行情况与配置1.1 查看 Redis 是否正在运行1.2 连接 Redis 服务并获取配置信息1.3 查找 redis.conf 配置文件位置 2 关闭旧版本 Redis 实例2.1 使用客户端命令关闭 Redis2.2 验证 Redis 是否完全关闭 3 升级 GCC 编译环境3.1 检查当前 GCC 版本3.2 安装…

SQLord: 基于反向数据生成和任务拆解的 Text-to-SQL 企业落地方案

曾在Text-to-SQL方向做过深入的研究&#xff0c;以此为基础研发的DataAgent在B2B平台成功落地&#xff0c;因此作为第一作者&#xff0c;在 The Web Conference (WWW’2025, CCF-A) 会议上发表了相关论文&#xff1a; SQLord: A Robust Enterprise Text-to-SQL Solution via R…

内网搭建NTS服务器

内网搭建NTS服务器 关键字 : ntp nts ipv6 NTS 是 Network Time Security&#xff08;网络时间安全&#xff09;的缩写,是 NTP 的一种安全扩展机制。它利用传输层安全&#xff08;TLS&#xff09;和相关数据的认证加密&#xff08;AEAD&#xff09;&#xff0c;为 NTP 的客户…

AD9268、AD9643调试过程中遇到的问题

Ad9268芯片 AD9268是一款双通道、16位、80 MSPS/105 MSPS/125 MSPS模数转换器(ADC)。AD9268旨在支持要求高性能、低成本、小尺寸和多功能的通信应用。双通道ADC内核采用多级差分流水线架构&#xff0c;集成输出纠错逻辑。每个ADC都具有宽带宽、差分采样保持模拟输入放大器&…

用豆包写单元测试

用豆包写单元测试&#xff0c; 输入 vue 模板内容&#xff0c;输入 参考vue模板内容写一个单元测试要求用jest.mock实现构造完成&#xff0c;修复bug。npm run test:unit – tests/unit/views/xxx/xxx.spec.js看下 % Stmts 语句覆盖率&#xff1a;执行到的代码语句占总语句的比…

css样式块重复调用

通译灵码解释。还给了一些示例&#xff0c;包含传参等内容 scss和sass的区别。scss与sass是两种样式编写风格&#xff0c;scss是大括号加;号形式。而sass是缩进的格式使用scss为什么要要安装sass呢。sass是一门css预处理器语言。所以要安装。