完整教程:LeetCode 413 - 等差数列划分

news/2025/11/30 16:53:50/文章来源:https://www.cnblogs.com/ljbguanli/p/19289639

完整教程:LeetCode 413 - 等差数列划分

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 完整可运行代码:
      • 逐步拆解逻辑:
        • 1. 基础判断
        • 2. 变量定义
        • 3. 主循环判断差值
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

这道题看起来名字有点抽象,其实本质上是在找数组中“连续且公差一致”的子数组数量。换句话说,我们要找出所有长度≥3、且相邻元素差相同的子数组。

虽然听起来像是数学题,但实现上其实是一个动态规划(DP)+ 连续计数的过程。
本文会带你从实际开发的角度去理解这个问题,结合 Swift 代码一步步拆解逻辑,让你对动态规划类题目不再害怕。

描述

题目定义了等差数列
当一个序列至少有 3 个元素,并且每两个相邻元素之间的差值相等时,它就是等差数列。

我们要做的就是统计一个整数数组中,所有连续子数组中符合等差条件的数量

举几个例子:

输入: nums = [1,2,3,4]
输出: 3
解释: 等差子数组为:
[1,2,3], [2,3,4], [1,2,3,4]

也就是说,只要连续的差相等,不管多长都算。

这类题目其实在工程中也很常见,比如:

  • 日志分析中找出趋势稳定的时间段;
  • 金融数据中判断价格变化的线性阶段;
  • IoT 数据中检测传感器信号是否线性变化。

题解答案

核心思路是这样的:

  1. 我们从第三个元素开始遍历;
  2. 每次判断当前元素与前两个元素的差是否一致;
  3. 如果一致,就表示形成了新的等差子数组;
  4. 我们用一个变量 count 来记录以当前下标为结尾的等差子数组数量;
  5. 最后把所有 count 累加起来就是答案。

题解代码分析

完整可运行代码:

class Solution {
func numberOfArithmeticSlices(_ nums: [Int]) -> Int {
if nums.count < 3 { return 0 }  // 长度不足,直接返回 0
var count = 0       // 记录以当前元素为结尾的等差子数组数量
var result = 0      // 最终结果
for i in 2..<nums.count {
if nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2] {
count += 1
result += count
} else {
count = 0   // 不连续则重置
}
}
return result
}
}

逐步拆解逻辑:

1. 基础判断
if nums.count < 3 { return 0 }

如果数组长度小于 3,那肯定不可能存在等差子数组,直接返回。

2. 变量定义
var count = 0
var result = 0
  • count:用来存储“以当前元素结尾”的等差子数组数量。
  • result:用来累积所有的等差子数组数量。
3. 主循环判断差值
for i in 2..<nums.count {
if nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2] {
count += 1
result += count
} else {
count = 0
}
}

从下标 2 开始,因为要检查当前元素与前两个元素的差。

比如:

  • [1,2,3] 满足条件,count = 1
  • [1,2,3,4] 继续满足时,count = 2(即 [1,2,3,4][2,3,4]
  • 当出现断裂,比如 [1,2,3,8],则重置 count = 0

这个连续递增的 count 很精妙,它让我们不用枚举所有子数组,也能累积出等差子数组的数量。

示例测试及结果

let solution = Solution()
print(solution.numberOfArithmeticSlices([1,2,3,4]))
// 输出: 3
// 等差子数组: [1,2,3], [2,3,4], [1,2,3,4]
print(solution.numberOfArithmeticSlices([1,3,5,7,9]))
// 输出: 6
// 等差子数组: [1,3,5], [3,5,7], [5,7,9], [1,3,5,7], [3,5,7,9], [1,3,5,7,9]
print(solution.numberOfArithmeticSlices([7,7,7,7]))
// 输出: 3
// 等差子数组: [7,7,7], [7,7,7], [7,7,7,7]

这个结果很有趣,尤其是连续重复的数字 [7,7,7,7],它的公差是 0,也是一种“完美的等差数列”。

时间复杂度

我们只需遍历一遍数组,每次计算差值与计数,都是常数级操作。

时间复杂度:O(n)

空间复杂度

除了常数个辅助变量(countresult),没有使用额外存储空间。

空间复杂度:O(1)

总结

这道题看似是数学题,其实核心是“连续条件累积”的思想,非常适合用动态规划(或者说连续计数法)来解决。

在实际开发中,这类问题可以抽象成很多应用场景,比如:

  • 稳定趋势检测(比如判断温度是否连续上升且差值稳定)
  • 数据平滑段统计(比如判断股价的线性阶段)
  • 信号序列分析(找出满足线性变化的时间段)

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

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

相关文章

为什么在anacnda prompt里面运行了激活虚拟环境的命令,却还是没有切换成虚拟环境?

问题: (base) C:\Users\xsy>conda activate yolo (base) C:\Users\xsy> 为什么在anacnda prompt里面运行了激活yolo虚拟环境,但是还是没有切换成虚拟环境? 在 Anaconda Prompt 里输入了 conda activate yolo …

Oracle 19c数据库升级PSU版本及Patch安装操作指南

Oracle 19c数据库升级PSU版本及Patch安装操作指南前言 本文适用于Oracle 19c RAC(Real Application Clusters)环境,详细记录了从低版本升级至19.9.0版本的完整流程,以及针对大表分区操作报错(ORA-600:[kkpapDIPOb…

[豪の算法奇妙冒险] 代码随想录算法训练营第九天 | 151-翻转字符串里的单词、Carl55-右旋转字符串、28-实现strStr()、459-重复的子字符串

LeetCode151 翻转字符串里的单词、Carl55 右旋转字符串、LeetCode28 实现strStr()、LeetCode459 重复的子字符串代码随想录算法训练营第九天 | 151-翻转字符串里的单词、Carl55-右旋转字符串、28-实现strStr()、459-重…

JMeter查询快递(以快递100为例)

1. 准备参数:获取快递100的API Key和快递单号(如顺丰、圆通等)。 2. 新建线程组:测试计划→添加→线程组,命名“快递查询线程组”。 3. 添加HTTP请求:线程组→添加→取样器→HTTP请求,命名“查询快递轨迹”。协…

在线调试+JMeter联动(以万维易源接口为例)

1. 在线调试接口:登录万维易源平台开通天气接口,进入接口详情页找到接口地址 https://route.showapi.com/9-2 ,在线调试页输入城市(如烟台)和个人 appKey ,点击调试,确认接口能正常返回天气数据。 2. JMeter配置…

征程 6 | QAT 新版 qconfig 量化模板使用教程

1.前言 随着 征程 6 芯片家族的阵容不断壮大,算法工具链在量化精度方向的优化也在持续深入,具体体现在两个方面:征程 6P 与 征程 6H 工具链已陆续进入发布和试用阶段,在此背景下,QAT(量化感知训练)需要以更高效…

计算机毕设java幼儿园校车管理高效的系统 基于Java的幼儿园校车信息管理系统设计与实现 Java环境下幼儿园校车运营管理平台开发

计算机毕设java幼儿园校车管理高效的系统 基于Java的幼儿园校车信息管理系统设计与实现 Java环境下幼儿园校车运营管理平台开发2025-11-30 16:43 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !impo…

在线调试+JMeter联动(以聚合数据快递接口为例)

1. 在线调试接口:登录聚合数据平台,开通“快递查询”接口,进入接口详情页的“在线调试”功能。输入快递单号、选择快递公司、填写个人API Key,点击“调试”。 确认接口返回正常(如包含“success: true”和轨迹列表…

手艺文档搭建实战:基于PandaWiki的五步自动化方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

JMeter调用中国天气网接口查看天气预报

1. 新建线程组:打开JMeter,右键测试计划选择“添加”→“线程组”,命名为“天气查询线程组”。 2. 配置获取城市代码的HTTP请求:右键线程组添加“取样器”→“HTTP请求”,命名“获取城市代码”。服务器填 toy1.we…

1. 人工智能发展与springAi

View Post1. 人工智能发展与springAi人工智能发展智能本质上就是针对不同情境给出针对性的输出反应。AI,人工智能(Artificial Intelligence),使机器能够像人类一样思考、学习和解决问题的技术。AI发展至今大概可以…

AI元人文构想:回应《自动驾驶技术的伦理认同与社会化应用治理》——规则库的范式分野与价值原语化的理论必然

AI元人文构想:回应《自动驾驶技术的伦理认同与社会化应用治理》——规则库的范式分野与价值原语化的理论必然 引子:2025年7月11日,中国社会科学网的《自动驾驶技术的伦理认同与社会化应用治理》一文(下称“《治理》…

20232315 2025-2026-1 《网络与系统攻防技术》实验七实验报告

20232315 2025-2026-1 《网络与系统攻防技术》实验七实验报告20232315 2025-2026-1 《网络与系统攻防技术》实验七实验报告 目录一、实验基本信息二、实验内容及要求三、实验过程3.1 简单应用SET工具建立冒名网站3.2 e…

NOIP 2025 游记 退役记 回忆录

NOIP 2025 游记 & 退役记 & 回忆录 坐标 HA,高二。 游记 闲话 自从 -s 考完之后,感觉像是没心劲了一样,身体渐渐随着高强度的集训垮了下来,训练的效果也越来越差,模拟赛从 -s 前的场均 200-300 掉到了 10…

ML - F1 score

ML - F1 scoreThe F1 score is a metric used to evaluate the performance of a classification model, especially when the classes are imbalanced. It is the harmonic mean of two other metrics:Precision: Of …

多模态技术深度探索:融合视觉与语言的AI新范式 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

设计模式的6大原则,和23个设计模式

设计模式六大原则核心是 “让代码好改、好用、不浪费”,用大白话拆解如下: 1. 单一职责原则:一个类只干一件事核心:每个类 / 模块只负责一个功能,别让它又当 “厨师” 又当 “服务员”。 举例:订单类只管订单的创…

2025年必看!9款AI写论文工具推荐,查重率低效率翻倍

作者在校园咖啡馆,听为毕业论文发愁的好友抱怨后,决定分享测评过的9款AI论文写作工具。其中包括鲲鹏智写、瑞达写作、PaperFine等。像鲲鹏智写能30分钟生成5万字初稿,还具备智能改稿等多种功能;PubScholar整合中科…

苍穹外卖-异常排查笔记:拆分微服务后出现的401,403报错处理

苍穹外卖微服务模块调用与异常排查笔记 问题背景与要解决的问题 1. 背景 苍穹外卖项目从单体架构拆分为微服务架构,拆分出sky-common(公共模块)、sky-server-gateway(网关模块)、sky-server-admin-operation(管理…

WinForm界面布局

在C# WinForm中,界面布局是创建用户友好且功能完善应用程序的关键部分。以下详细介绍常见的布局方式及其示例。 1. 绝对定位(Absolute Positioning)原理:通过设置控件的 Location 属性(指定控件左上角相对于其父容…