O(n^2)的思路很容易想:
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int n = A.size(), res = 0;
for(int i=0;i<n-2;i++){
int d = A[i+1]-A[i];
for(int j=i+1;j<n;j++){
if(A[j]-A[j-1]!=d){
break;
}
if(j-i>=2) res++;
}
}
return res;
}
};
O(n)的思路dp[i]表示以i结尾的等差数列的个数。
dp[i] = dp[i-1] +1
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int n = A.size();
// dp[i] 表示以i结尾子数组中等差数列的个数
vector<int> dp(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;
}
};