「动态规划」如何求子数组中等差数列的个数?

news2024/12/23 10:59:53

413. 等差数列划分icon-default.png?t=N7T8https://leetcode.cn/problems/arithmetic-slices/description/

如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,[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。


我们用动态规划的思想来解决这个问题。

确定状态表示:根据经验和题目要求,我们用dp[i]表示:以i位置为结尾的所有子数组中,等差数列的个数

推导状态转移方程:既然是以i位置为结尾的等差数列,那么nums[i - 2]、nums[i - 1]和nums[i]首先要构成等差数列,因为题目中说明了等差数量的长度至少是3。所以我们可以分类讨论:

  • 如果nums[i - 2]、nums[i - 1]和nums[i]不构成等差数列,显然dp[i] = 0。
  • 如果nums[i - 2]、nums[i - 1]和nums[i]构成等差数列,那么如果一个等差数列以i - 1位置为结尾,这个等差数列的末尾加上nums[i]就依然是一个等差数列。所以,以i位置为结尾的等差数列分为2类:以i - 1位置为结尾的等差数列的末尾加上nums[i]构成的等差数列,以及nums[i - 2]、nums[i - 1]和nums[i]构成的等差数列。注意:后一种情况不属于前一种情况,因为nums[i - 2]、nums[i - 1]只有2个元素,不构成等差数列。所以,此时dp[i] = dp[i - 1] + 1。

如果nums[i - 2]、nums[i - 1]和nums[i]构成等差数列,那么nums[i - 1] * 2 = nums[i] + nums[i - 2]。所以状态转移方程是:dp[i] = nums[i - 1] * 2 == nums[i] + nums[i - 2] ? dp[i - 1] + 1 : 0

初始化:根据状态转移方程,我们需要初始化dp[0]和dp[1]的值,防止越界。注意计算dp[1]也会导致越界,因为要判断nums[-1]、nums[0]和nums[1]是否构成等差数列。显然dp[0] = dp[1] = 0,因为等差数列至少有3个元素。

填表顺序:根据状态转移方程,显然要从左往右填表

返回值:根据状态表示,由于我们不确定等差数列的结尾位置,所以应返回dp表中所有元素的和

细节问题:dp表的规模和nums相同,均为1 x n

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

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& nums) {
        int n = nums.size();

        // 创建dp表
        vector<int> dp(n);

        // 填表
        for (int i = 2; i < n; i++) {
            if (nums[i - 1] * 2 == nums[i] + nums[i - 2]) {
                dp[i] = dp[i - 1] + 1;
            }
        }

        // 返回结果
        return accumulate(dp.begin(), dp.end(), 0);
    }
};

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

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

相关文章

c++中从父类继承的属性在子类内存中如何显示?

目录 一、继承概念 二、示例 三、结论 一、继承概念 在C中&#xff0c;继承是面向对象编程的一个重要特性&#xff0c;它允许一个类&#xff08;称为派生类或子类&#xff09;继承另一个类&#xff08;称为基类或父类&#xff09;的成员&#xff08;包括数据成员和成员函数…

耳夹式佩戴的舒适体验,拥有AI功能的生活助手,塞那Z50耳夹耳机上手

在数码产品层出不穷的今天&#xff0c;一款能够脱颖而出的耳机&#xff0c;不仅要有出色的音质&#xff0c;更要有人性化的设计和独特的功能。最近我就发现了这么一款很有趣的耳机&#xff0c;它是来自sanag塞那Z50耳夹耳机&#xff0c;这款耳机有着新颖的佩戴方式和动听的音质…

算出未来——2024年,计算机相关专业仍是热门

随着高考结束&#xff0c;数百万考生和家长们开始着手专业选择与志愿填报。 选择大学专业不仅关乎未来四年的学习生涯&#xff0c;更可能决定一个人一生的职业方向和人生轨迹。 在众多专业中&#xff0c;计算机相关专业因其广泛的就业前景和不断变化的行业需求&#xff0c;一…

Springboot应用的信创适配

CentOS7在2024.6.30停止维护后&#xff0c;可替代的Linux操作系统-CSDN博客 全面国产化之路-信创-CSDN博客 信创适配评测-CSDN博客 Springboot应用的信创适配 Springboot应用的信创适配&#xff0c;如上图所示需要适配的很多&#xff0c;从硬件、操作系统、中间件&#xff08…

Linux驱动开发笔记(十二)并发与竞争

文章目录 前言一、并发与竞争的引入1.1 并发1.2 竞争1.3 解决方法 二、原子操作2.1 概念2.2 使用方法 三、自旋锁3.1 概念3.2 使用方法3.3 自旋锁死锁 四、信号量4.1 概念4.2 使用方法 五、互斥锁5.1 概念5.2 使用方法 前言 Linux的子系统我们已经大致学习完了&#xff0c;笔者…

tauri中从前端ts调用rust函数,并异步收到响应结果

在前端是可以异步调用rust代码的&#xff0c;而且还是挺简单的逻辑&#xff0c;一共就三步&#xff1a;定义rust函数&#xff0c;注入到invoke_handler中&#xff0c;在前端调用。有英文能力的可以看官方文档&#xff1a;Calling Rust from the frontend | Tauri Apps 没有英文…

AI数据分析:根据时间序列数据生成动态条形图

动态条形竞赛图&#xff08;Bar Chart Race&#xff09;是一种通过动画展示分类数据随时间变化的可视化工具。它通过动态条形图的形式&#xff0c;展示不同类别在不同时间点的数据排名和变化情况。这种图表非常适合用来展示时间序列数据的变化&#xff0c;能够直观地显示数据随…

Vatee万腾平台:智能科技的领航者

随着科技的飞速发展&#xff0c;数字化转型已成为企业、行业乃至整个社会不可逆转的趋势。在这个变革的浪潮中&#xff0c;Vatee万腾平台凭借其卓越的技术实力、前瞻的战略眼光和卓越的服务品质&#xff0c;成为了智能科技的领航者。 Vatee万腾平台致力于为企业提供全方位的数字…

[Composer\Downloader\TransportException] 需要切换下载源

使用composer 下载时遇到问题&#xff1a; 如图 切换镜像源&#xff1a; /成阿里镜像&#xff1a; composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ //Laravel China镜像&#xff1a; composer config -g repo.packagist composer https:…

2024最新版DataGrip安装教程-全网最全教程!!!

1.DataGrip下载安装 1.打开DataGrip官网&#xff0c;选择自己需要的版本下载即可&#xff1a; 2.进行安装&#xff1a; 3.重启打开&#xff1a; 我这个是正版激活码激活的&#xff0c;需要教程可以关注留言

展厅装修时候需要注意哪些细节

1、视觉方面 展厅应该具有很强的视觉冲击力。只有这样不论是领导视察还是合作的客户进行参观的时候才会对展厅产生浓厚的兴趣&#xff0c;同时产生一种亲和力&#xff0c;并直接加深对企业的识别度和记忆度。而个性化设计要跟企业文化相符合。这里&#xff0c;企业标志为寻求个…

Python发送Email的性能怎么样?如何配置?

Python发送Email怎么配置SMTP&#xff1f;批发邮件的方法技巧&#xff1f; Python是一种广泛使用的编程语言&#xff0c;因其简洁和强大的功能深受开发者喜爱。在许多应用场景中&#xff0c;Python发送Email是一个常见需求。那么&#xff0c;Python发送Email的性能怎么样呢&am…

分支循环之案例实战

1.求水仙花数 求1000以内的水仙花数。水仙花是指&#xff0c;一个三位数&#xff0c;其各位数字的立方和等于该数本身 n 100 while n < 1000:i n % 10j n // 10 % 10k n // 100if n i**3j**3k**3:print(n)n 1 2.求兔子数 有一对兔子&#xff0c;从第三个月开始生一对…

U-Net for Image Segmentation

1.Unet for Image Segmentation 笔记来源&#xff1a;使用Pytorch搭建U-Net网络并基于DRIVE数据集训练(语义分割) 1.1 DoubleConv (Conv2dBatchNorm2dReLU) import torch import torch.nn as nn import torch.nn.functional as F# nn.Sequential 按照类定义的顺序去执行模型&…

宝藏APP推荐| 话唠 | 话唠APP

软件介绍 话唠是一款专为年轻人打造的语音交友软件&#xff0c;该软件有着非常多的高质量用户&#xff0c;在这里你可以找到任何感兴趣的人进行聊天&#xff0c;广泛交友&#xff0c;扩大自己的交际圈&#xff0c;还能在这里偶遇心动的TA&#xff0c;软件还为用户提供了非常多…

路由的params参数,命名路由,路由的params参数,命名路由

上篇我们讲了vue路由的使用 今天我们来讲vue中路由的嵌套&#xff0c;路由的params参数,命名路由 一.路由的params参数 1.配置路由规则&#xff0c;使用children配置项&#xff1a; router:[{path:/about,component:About,},{path:component:Home,//通过children配置子路由c…

以太坊==windows电脑本地搭建一个虚拟的以太坊环境

提供不同的选择&#xff0c;适合不同需求和技术水平的开发者&#xff1a; Geth&#xff1a;适合需要与主网兼容或构建私有网络的开发者。Ganache&#xff1a;适合快速开发和测试智能合约的开发者&#xff0c;特别是初学者。Docker&#xff1a;适合需要快速、可重复搭建环境的开…

高性能、高可靠性!Kafka的技术优势与应用场景全解析

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!​​​​​​​ 大家好,我是你们的小米,今天要和大家聊聊一个超级强大的消息系统——Kafka。很多同学可能对它还不太熟悉,不过没关系,今天我就带你们…

树和森林.

目录 一、树 1.1树的存储结构 1.1.1双亲表示法 1.1.2孩子链表 1.1.3孩子兄弟表示法 1.2树与二叉树的转换 1.2.1将树转换成二叉树&#xff1a; 1.2.2将二叉树转换成树 二、森林 2.1森林与二叉树的转换 2.1.1将森林转换成二叉树 2.1.2二叉树转换成森林 三、树和森林的…

找不到xinput1_3.dll如何修复?总结几种靠谱的修复方法

在数字时代&#xff0c;软件问题几乎是每个电脑用户都会遇到的难题。最近&#xff0c;我也遇到了一个令人头疼的问题——xinput1_3.dll文件丢失。这个问题导致我无法正常运行一些游戏&#xff0c;十分影响我的娱乐体验。通过这次修复经历&#xff0c;我不仅解决了问题&#xff…