A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same.
For example, these are arithmetic sequence:
<pre>1, 3, 5, 7, 9
7, 7, 7, 7
3, -1, -5, -9</pre>
The following sequence is not arithmetic.
<pre>1, 1, 2, 5, 7</pre>
A zero-indexed array A consisting of N numbers is given. A slice of that array is any pair of integers (P, Q) such that 0 <= P < Q < N.
A slice (P, Q) of array A is called arithmetic if the sequence:
A[P], A[p + 1], ..., A[Q - 1], A[Q] is arithmetic. In particular, this means that P + 1 < Q.
The function should return the number of arithmetic slices in the array A.
Example:
<pre>
A = [1, 2, 3, 4]
return: 3, for 3 arithmetic slices in A:
[1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.
</pre>
其實這題沒怎么讀明白,大概的意思就是問這一串數里頭包含多少個等差數列,最短的是三個成一個等差數列。
<pre>
1,2,3// 1個 [1 2 3]
1,2,3,4// 3個 [1 2 3] [2 3 4] [1 2 3 4]
1,2,3,4,5//6個[1 2 3][2 3 4][3 4 5] [1 2 3 4][2 3 4 5] [1 2 3 4 5]
</pre>
這個有規律,按數列元素個數分,N個數的等差數列有N-2 種,N+1個數的,相當于前N-2種每種比N個的多一個,再多加一個N+1個數的數列,相當于N+1的比N個數的多N-2+1個,即(N+1)-2個。
所以就循環,從頭到尾數,可以組成幾個最長的等差數列就好了。累加起來就是結果。
代碼如下。
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int res = 0;
int add = 0; //這個數與前頭形成等差數列,會增加幾個等差數列。
for(int i = 2;i<A.size();i++)
{
if(A[i-1]-A[i-2] == A[i]-A[i-1])
{
add++;
res += add;
}
else
add = 0;
}
return res;
}
};