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;
    }
}
原文地址:https://www.cnblogs.com/reboot329/p/5965853.html