解法一
先求出相邻两数之差,然后计算相同差值连续出现的长度,通过组合可以算出这一段子数列可以提供的等差数列方案数。
我这个时间复杂度也是,不知道为什么运行时间上偏慢🙃。
class Solution {
public int numberOfArithmeticSlices(int[] A) {
if (A.length <= 2) {
return 0;
}
int len = A.length - 1;
// 差值数组
int[] delta = new int[len];
for (int i = 0; i < len; ++i) {
delta[i] = A[i + 1] - A[i];
}
// 总方案数
int ans = 0;
int l = 1;
for (int i = 1, d = delta[0]; i < len; ++i) {
if (delta[i] == d) {
++l;
} else {
ans += C(l, 2);
d = delta[i];
l = 1;
}
}
ans += C(l, 2);
return ans;
}
/**
* 组合数计算
*
* @param n 总元素数
* @param m 要取的元素数
* @return 从n个不同元素中取出m个元素的组合数
*/
private int C(int n, int m) {
if (n < m) {
return 0;
}
int ans = 1;
for (int i = n; i > n - m; --i) {
ans *= i;
}
for (int i = m; i > 1; --i) {
ans /= i;
}
return ans;
}
}