每日OJ题_子数组子串dp⑤_力扣413. 等差数列划分

目录

力扣413. 等差数列划分

解析代码


力扣413. 等差数列划分

413. 等差数列划分

难度 中等

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。

  • 例如,[1,3,5,7,9][7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。

给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。

子数组 是数组中的一个连续序列。

示例 1:

输入:nums = [1,2,3,4]
输出:3
解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。

示例 2:

输入:nums = [1]
输出:0

提示:

  • 1 <= nums.length <= 5000
  • -1000 <= nums[i] <= 1000
class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {}
};

解析代码

        首先等差数列至少是三个数,由于研究对象是一段连续的区间,如果我们状态表示定义成 [0, i] 区间内一共有多少等差数列,那么在分析 dp[i] 的状态转移时,会无从下手,因为我们不清楚前面那么多的等差数列都在什么位置。所以说,定义的状态表示必须让等差数列有迹可循,让状态转移的时候能找到大部队。因此,可以固定死等差数列的结尾,定义下面的状态表示:

dp[i] 表示必须以 i 位置的元素为结尾 的等差数列有多少种。

        在做题之前需要了解⼀下等差数列的性质:如果 a b c 三个数成等差数列,这时候来了一个d,其中 b c d 也能构成⼀个等差数列,那么 a b c d 四个数也能够成等差序列。因为他们之间相邻两个元素之间的差值都是⼀样的。

        有了这个理解,我们就可以转而分析我们 的状态转移方程了。 对于 dp[i] 位置的元素 nums[i],会与前面的两个元素有下面两种情况:

  • nums[i - 2], nums[i - 1], nums[i] 三个元素不能构成等差数列:那么以 nums[i] 为结尾的等差数列就不存在,此时 dp[i] = 0 ;
  • nums[i - 2], nums[i - 1], nums[i] 三个元素可以构成等差数列:那么以 nums[i - 1] 为结尾的所有等差数列后面填上一个 nums[i] 也是一个等差数列,此时 dp[i] = dp[i - 1] 。但是,因为 nums[i - 2], nums[i - 1], nums[i] 三 者又能构成一个新的等差数列,因此要在之前的基础上再添上一个等差数列,于是 dp[i] = dp[i - 1] + 1 。

综上所述:状态转移方程为:

  • 当: nums[i - 2] + nums[i] != 2 * nums[i - 1] 时, dp[i] = 0;
  • 当: nums[i - 2] + nums[i] == 2 * nums[i - 1] 时, dp[i] = 1 + dp[i - 1];

也可以为 dp[i] = nums[i]-nums[i-1] == nums[i-1]-nums[i-2] ? dp[i-1]+1 : 0;

初始化就是dp[0] = dp[1] = 0; 从左往右填表,最后返回dp表的所有值。

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {// dp[i] 表示必须以 i 位置的元素为结尾 的等差数列有多少种int n = nums.size();vector<int> dp(n);int ret = 0;for(int i = 2; i < n; ++i){   // 前两个默认为0dp[i] = nums[i]-nums[i-1] == nums[i-1]-nums[i-2] ? dp[i-1]+1 : 0;ret += dp[i];       }return ret;}
};

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

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

相关文章

流畅切换Linux的应用程序

流畅切换Linux的应用程序 流畅切换Linux的应用程序一.Linux启动一个程序在后台执行1. 使用nohup和&&#xff1a;2. 使用ctrlZ&#xff1a;3.使用screen&#xff1a;3.1 创建会话3.2 要重新连接到此会话&#xff1a;3.3 中途退出会话&#xff0c;但程序继续运行:3.4 结束一个…

第十节HarmonyOS 常用容器组件3-GridRow

1、描述 栅格容器组件&#xff0c;仅可以和栅格子组件&#xff08;GridCol&#xff09;在栅格布局场景中使用。 2、子组件 可以包含GridCol子组件。 3、接口 GridRow(options:{columns: number | GridRowColumnOption, gutter?: Length | GutterOption, Breakpoints?: B…

把 Taro 项目作为一个完整分包,Taro项目里分包的样式丢失

现象&#xff1a; 当我们把 Taro 项目作为原生微信小程序一个完整分包时&#xff0c;Taro项目里分包的样式丢失&#xff0c;示意图如下&#xff1a; 原因&#xff1a; 在node_modules/tarojs/plugin-indie/dist/index.js文件里&#xff0c;限制了只有pages目录下会被引入app.w…

Springboot实现qq邮件的发送

一、打开必要的邮件设置 首先登录qq邮箱官网登录之后&#xff0c;在设置中将传输协议给打开&#xff0c;我们需要用这个秘钥作为发件人的邮箱授权。 这里开启之后&#xff0c;记住这个秘钥。 二、代码编写 首先我们将作为发送邮件的账户信息写入配置文件。 spring:mail:hos…

windows server 下的mysql 8.0.28修改数据库目录

1. 查看当前数据库存储位置 show global variables like %datadir%; 默认是&#xff1a;C:\ProgramData\MySQL\MySQL Server 8.0\Data 2. 修改 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini配置文件。如下&#xff1a; datadirD:/ProgramData/MySQL/MySQL Server 8.0/Dat…

小兴教你做平衡小车-JGB37-520电机介绍

文章目录 1 前言2 分析电机安装板3 介绍电机驱动板3.1 电机驱动板原理图3.2 电机驱动板PCB图3.2 电机驱动板3D效果图 1 前言 为了更好的对JGB37-520这款电机有个了解&#xff0c;这里直接上图应该会清晰些。这款电机带有霍尔编码器&#xff0c;方便对车轮的转速进行采集。咱们…

vulnhub-----pWnOS1.0靶机

文章目录 1.信息收集2.漏洞测试3.爆破hash4.提权 首先拿到一台靶机&#xff0c;就需要知道靶机的各种信息&#xff08;IP地址&#xff0c;开放端口&#xff0c;有哪些目录&#xff0c;什么框架&#xff0c;cms是什么&#xff0c;网页有什么常见的漏洞&#xff0c;如sql注入&…

第2讲-Memory(3)主存

主存储器 多模块存储器

数据库系统概论-第16章 数据仓库与联机分析处理技术

概念性的介绍&#xff0c;一略而过&#xff0c;不重要。 16.1 数据仓库技术 16.2 联机分析处理技术 16.3 数据挖掘技术 16.4 大数据时代的新型数据仓库 16.5 小结

3d画线生成模型之后最大化找不到---模大狮模型网

当你在3D建模软件中画线生成模型后&#xff0c;如果最大化找不到该模型&#xff0c;可能是因为以下几种情况导致&#xff1a; 模型位置偏移&#xff1a; 可能你在绘制线条时&#xff0c;将模型画在了视图界面之外&#xff0c;导致最大化时无法看到。尝试平移或旋转模型&#x…

vue3中如何实现多个侦听器(watch)

<body> <div id"app"><input type"button" value"更改名字" click"change"> </div> <script src"vue.js"></script> <script>new Vue({el: #app,data: {food: {id: 1,name: 冰激…

MySQL中行锁、表锁、悲观锁、乐观锁和共享锁

在操作数据库的时候&#xff0c;可能会由于并发问题而引起的数据的不一致性&#xff08;数据冲突&#xff09;&#xff0c;如何保证数据并发访问的一致性、有效性&#xff0c;是所有数据库必须解决的一个问题&#xff0c;锁的冲突也是影响数据库并发访问性能的一个重要因素&…

大模型开发框架langchain系列教程

LangChain 是一种框架&#xff0c;借助 LangChain&#xff0c;与大语言模型的交互变得更加便捷。 LangChain 提供的接口和功能有助于将 LLM 的强大能力轻松集成到你的工作应用程序中。 我做了一个langchain的教程系列&#xff0c;详情请看&#xff1a; 大模型应用框架LangChai…

透视未来工厂:山海鲸可视化打造数字孪生新篇章

在信息化浪潮的推动下&#xff0c;数字孪生工厂项目正成为工业制造领域的新宠。作为一名山海鲸可视化的资深用户&#xff0c;我深感其强大的数据可视化能力和数字孪生技术在工厂管理中的应用价值&#xff0c;同时我们公司之前也和山海鲸可视化合作制作了一个智慧工厂项目&#…

Matlab与高光谱遥感:环境监测的新时代

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

Python实战:日志记录与调试技巧

一、引言 在软件开发过程中&#xff0c;日志记录和调试是确保代码质量和效率的关键。日志记录可以帮助我们记录和分析程序的运行情况&#xff0c;而调试则是找出和修复程序中的错误。Python作为一种广泛使用的编程语言&#xff0c;提供了丰富的日志记录和调试工具。本文将详细…

“postinstall“: “patch-package“ 修补安装包补丁

在 package.json 文件里&#xff0c;postinstall 是一个钩子脚本&#xff0c;它在每次运行 npm install 命令后自动执行。当你在该字段中指定 "patch-package" 时&#xff0c;意思是在 npm install 安装所有依赖包之后&#xff0c;自动运行 patch-package 命令。 pa…

【Python模块】

Python模块是一个包含Python定义和语句的文件。 模块可以定义函数、类和变量。 模块也可以包含可执行的代码。一个模块就是一个包含Python代码的文件&#xff0c;文件后缀是.py。模块可以被其他程序引入&#xff08;import&#xff09;&#xff0c;以使用该模块中的函数等功能…

【JAVA】Springboot集成Proguard完成jar包混淆

目录 一、需求背景 二、具体实现 一、需求背景 某些情况下需要将jar包交付给第三方&#xff0c;担心第三方会将代码进行反编译&#xff0c;故需要将jar包进行处理。 jar包源码混淆工具有多种&#xff0c;但真正能投入使用的产品并不多。 比如 ClassFinal (ClassFinal: Jav…

三星工厂突发大火···  | 百能云芯

据韩媒报道&#xff0c;三星SDI位于韩国京畿道龙仁市基兴区的器兴工厂发生火灾。火灾发生在当地时间周四下午15:37左右&#xff0c;持续约20分钟后被扑灭。 幸运的是&#xff0c;此次火灾并未造成人员伤亡&#xff0c;但火场附近的一些帐篷已经被烧毁。消防部门目前正在调查火灾…