Question
Given an unsorted array of length N, a slice is defined as a pair of numbers (P, Q) so that:
- 0 <= P < Q <= N
 - A[P], A[P+1]….A[Q] is arithmetic sequence
 Example:
input = { -1, 1, 3, 3, 3, 2, 1, 0 }Output 5 because there’re slices:
(0, 2) (2, 4) (4, 6) (4, 7) (5, 7)
Solution
- count the length of arithmetic (countinuous) sequence
 - form some slices
 - proceed from the end of that sequence, till the end.
 
Code
public int solve(int[] input) {
    int len = input.length;
    int p = 0;
    int totalSlices = 0;
    while (p + 1 < len) {
        // check if there is a arithmetic sequence starting at p
        // note that p is NOT the last element.
        int diff = input[p + 1] - input[p];
        int q = p + 1;
        // starting from q, check arithmetic difference
        while (q < len) {
            if (input[q] - input[q - 1] == diff) {
                q++;
            } else {
                break;
            }
        }
        // so, the range [p, q-1] is a arithmetic sequence.
        int seqLength = q - p;
        if (seqLength >= 3) {
            totalSlices += getSlicesCountFromArithmeticSeq(seqLength);
        }
        // update p (skip the range [p, q-1])
        p = q - 1;
    }
    return totalSlices;
}
private int getSlicesCountFromArithmeticSeq(int k) {
    // choose 2 from (k - 1)
    return (k - 1) * (k - 2) / 2;
}