思路:等差数列的性质 A[i] - A[i - 1] == A[i - 1] - A[i - 2]
方法1:暴力,一旦当前区间不满足等差数列了,那就不需要继续判断了。
class Solution {
public int numberOfArithmeticSlices(int[] A) {
int n = A.length;
if(n < 3) return 0;
int count = 0;
for(int i = 0; i < n - 2; i++){
int d = A[i + 1] - A[i];
for(int j = i + 2; j < n; j++){
if(A[j] - A[j - 1] == d){
count++;
}else{
// 一旦当前区间不满足等差数列了,那就不需要继续判断了。
break;
}
}
}
return count;
}
}
方法2:
动态规划 dp[i]表示以当前位置结尾时,共有多少个等差数列。
dp[i] = dp[i - 1] + 1 含义为,
以当前位置结尾时的等差数列个数 = 以前一个位置结尾时的等差数列个数 + 1,最后遍历dp相加即可。
class Solution {
public int numberOfArithmeticSlices(int[] A) {
if (A.length < 3) return 0;
int n = A.length;
int[] dp = new int[n];
int sum = 0;
for (int i = 2; i < n; i++){
if (A[i] - A[i - 1] == A[i - 1] - A[i - 2]){
dp[i] = dp[i - 1] + 1;
sum += dp[i];
}
}
return sum;
}
}