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

LeetCode-413. 等差数列划分

1、题目描述:

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

  • 例如,[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

2、代码

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();// 等差数列至少需要3个元素if (n < 3) return 0;// dp[i]表示以索引i结尾的等差数列的数目vector<int> dp(n, 0);int total = 0; // 记录所有等差子数组的总数// 从索引2开始遍历,因为等差数列至少需要前三个元素for(int i = 2; i < n; ++i) {// 判断是否构成等差数列:当前差等于前一个差if(nums[i] - nums[i - 1] == nums[i - 1] - nums[i -2]) {// 若构成等差数列,dp[i] = 以i-1结尾的数目 + 1(新增长度为3的数列)dp[i] = dp[i - 1] + 1;// 累加当前位置贡献的等差数列数目total += dp[i];}// 若不构成等差数列,dp[i]保持0(初始化值)}return total;}
};

3、解题思路

  1. 动态规划数组定义:定义一个数组 dp,其中 dp[i] 表示以位置 i 结尾的等差数列的数目。
  2. 状态转移:对于位置 i,如果 nums[i] - nums[i-1] == nums[i-1] - nums[i-2],则 dp[i] = dp[i-1] + 1。这是因为如果当前位置能和前面的元素构成等差数列,那么以 i 结尾的等差数列数目等于以 i-1 结尾的数目加 1(新增的等差数列长度为 3)。
  3. 结果累加:遍历整个数组,将每个位置的 dp[i] 累加起来,得到最终结果。
http://www.xdnf.cn/news/922951.html

相关文章:

  • Go深入学习延迟语句
  • 【QT】输入类控件 详解
  • 嵌入式里的时间魔法:RTC 与 BKP 深度拆解
  • 数据通信基础
  • 迷宫问题(一)(C++版本)
  • @ExceptionHandler 默认无法拦截 Aspect(切面)中抛出的异常
  • centos7编译安装LNMP架构
  • docker安装RabbitMQ
  • 一些因子的解释
  • 人工智能--AI换脸
  • iview框架主题色的应用
  • WebWorker-----高频面试题(浏览器篇)
  • 【每天一道算法题】用JavaScript实现的字符串比较算法
  • 【云架构】
  • 后端下载限速(redis记录实时并发,bucket4j动态限速)
  • Java 常用 API 分类总结(算法竞赛考前速记篇)- 适用于算法竞赛(如 CCF CSP、蓝桥杯、NOI)
  • 【PhysUnits】15.17 比例因子模块 (ratio.rs)
  • 河南建筑安全员B证考试最新精选题
  • Python 函数全攻略:函数基础
  • JavaSec-SpringBoot框架
  • JAVA理论第三章-多线程
  • Python实例题:Python计算微积分
  • 2025年06月07日Github流行趋势
  • go语言学习 第9章:映射(Map)
  • 推客系统小程序开发:告别低效推广,开启精准获客新时代
  • C++课设:实现简易文件加密工具(凯撒密码、异或加密、Base64编码)
  • 25N60-ASEMI电源管理领域专用25N60
  • 基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
  • 【CSS-4】掌握CSS文字样式:从基础到高级技巧
  • Qt/C++学习系列之Excel使用记录