题目:我们称一组数列为arithmetic的,当数列至少有三个数,相邻的数字间的差是相同的。换句话说,就是判断该数列是不是等差数列。给定一数组,判断该数组中可以提取多少个等差数列。例子如下:
A = [1, 2, 3, 4] return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.
我们可以使用动态规划来解决问题。初始化数组dp,dp[i]表示在下标为0-i间的数,可以新增多少个等差数列,最后的总数为dp[0] + dp[1] + .... + dp[n-1].
dp所有元素初始化为0。部分过程如下:
代码如下:
public class Solution {
public int numberOfArithmeticSlices(int[] A) {
int[] dp = new int[A.length];
int sum = 0;
for (int i = 2; i < dp.length; i++) {
if (A[i] - A[i - 1] == A[i - 1] - A[i - 2]) {
dp[i] = 1 + dp[i - 1];
sum += dp[i];
}
}
return sum;
}
}