解法一

先求出相邻两数之差,然后计算相同差值连续出现的长度,通过组合可以算出这一段子数列可以提供的等差数列方案数。
我这个时间复杂度也是413. 等差数列划分 - 图1,不知道为什么运行时间上偏慢🙃。

  1. class Solution {
  2. public int numberOfArithmeticSlices(int[] A) {
  3. if (A.length <= 2) {
  4. return 0;
  5. }
  6. int len = A.length - 1;
  7. // 差值数组
  8. int[] delta = new int[len];
  9. for (int i = 0; i < len; ++i) {
  10. delta[i] = A[i + 1] - A[i];
  11. }
  12. // 总方案数
  13. int ans = 0;
  14. int l = 1;
  15. for (int i = 1, d = delta[0]; i < len; ++i) {
  16. if (delta[i] == d) {
  17. ++l;
  18. } else {
  19. ans += C(l, 2);
  20. d = delta[i];
  21. l = 1;
  22. }
  23. }
  24. ans += C(l, 2);
  25. return ans;
  26. }
  27. /**
  28. * 组合数计算
  29. *
  30. * @param n 总元素数
  31. * @param m 要取的元素数
  32. * @return 从n个不同元素中取出m个元素的组合数
  33. */
  34. private int C(int n, int m) {
  35. if (n < m) {
  36. return 0;
  37. }
  38. int ans = 1;
  39. for (int i = n; i > n - m; --i) {
  40. ans *= i;
  41. }
  42. for (int i = m; i > 1; --i) {
  43. ans /= i;
  44. }
  45. return ans;
  46. }
  47. }