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

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

摘要

这道题看起来名字有点抽象,其实本质上是在找数组中“连续且公差一致”的子数组数量。换句话说,我们要找出所有长度≥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)

总结

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

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

  • 稳定趋势检测(比如判断温度是否连续上升且差值稳定)
  • 数据平滑段统计(比如判断股价的线性阶段)
  • 信号序列分析(找出满足线性变化的时间段)
posted on 2025-11-30 16:46  ljbguanli  阅读(0)  评论(0)    收藏  举报