解法一
先求出相邻两数之差,然后计算相同差值连续出现的长度,通过组合可以算出这一段子数列可以提供的等差数列方案数。
我这个时间复杂度也是,不知道为什么运行时间上偏慢🙃。
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;}}
