leetcode 413.等差数列划分
问题:如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。给你一个整数数组 nums
,返回数组 nums
中所有为等差数组的 子数组 个数。
子数组 是数组中的一个连续序列。
示例1:
输入:nums = [1,2,3,4]
输出:3
解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。
示例2:
输入:nums = [1]
输出:0
思路:
-
边界:
int n = nums.size(); if (n < 3)return 0;
- 首先获取数组的长度
n
。 - 如果数组长度小于 3,直接返回 0。
- 首先获取数组的长度
-
初始化变量:
int count = 0, dp = 0;
count
:记录总的等差数列子数组的个数。dp
:记录当前连续的等差数列子数组的个数。
-
遍历数组:
for (int i = 2; i < n; i++) {if (nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]) {dp += 1;count += dp;} else {dp = 0;} }
-
从第三个元素开始遍历。
-
检查当前元素
nums[i]
、前一个元素nums[i-1]
和前前一个元素nums[i-2]
是否构成等差数列:- 如果满足,则
dp += 1
,当前连续的等差数列子数组长度增加1,
count += dp
,再将当前的等差数列子数组个数累加到count
中。- 如果不满足,则重置当前连续的等差数列子数组个数为0。
- 如果满足,则
-
-
返回结果:
return count;
代码:
class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();if (n < 3)return 0;int count = 0, dp = 0;for (int i = 2; i < n; i++) {if (nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]) {dp += 1;count += dp;} else {dp = 0;}}return count;}
};