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>
其實這題沒怎么讀明白,大概的意思就是問這一串?dāng)?shù)里頭包含多少個等差數(shù)列,最短的是三個成一個等差數(shù)列。
<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>
這個有規(guī)律,按數(shù)列元素個數(shù)分,N個數(shù)的等差數(shù)列有N-2 種,N+1個數(shù)的,相當(dāng)于前N-2種每種比N個的多一個,再多加一個N+1個數(shù)的數(shù)列,相當(dāng)于N+1的比N個數(shù)的多N-2+1個,即(N+1)-2個。
所以就循環(huán),從頭到尾數(shù),可以組成幾個最長的等差數(shù)列就好了。累加起來就是結(jié)果。
代碼如下。
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int res = 0;
int add = 0; //這個數(shù)與前頭形成等差數(shù)列,會增加幾個等差數(shù)列。
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;
}
};