413. Arithmetic Slices
找到所有长度大于3的等差数列。
用DP dp[i]代表以nums[i]开始往右,有多少个等差数列。
遍历数组,以每一个数nums[i]为等差数列最左值,看看有多少种情况。
i+1的时候如果也成等差数列,看看它和nums[i]的差一不一样,一样的话只比dp[i]的情况小1。。
然后因为只需要前一个情况,不需要DP,就前一个就行了。
public class Solution
{
public int numberOfArithmeticSlices(int[] A)
{
if(A.length < 3) return 0;
int res = 0;
int prev = 0;
for(int i = 0; i < A.length-2;i++)
{
if(A[i+1] - A[i] == A[i+2] - A[i+1])
{
if(i != 0 && A[i] - A[i-1] == A[i+1] - A[i]) res += --prev;
else
{
prev = 1;
int j = i+3;
int diff = A[i+1] - A[i];
while(j < A.length && A[j] - A[j-1] == diff)
{
prev++;
j++;
}
res += prev;
}
}
else prev = 0;
}
return res;
}
}