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:
The following sequence is not arithmetic.
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.
没有明确给出.
这道题的题目不是一般的长,其实就是一个意思:给你一串数字,返回这串数字中能够构成等差数列的子串的数目。
我的想法是通过扫描一遍数组就能得到结果,所以得先知道如果扫描发现下一个数字能够加入到等差数列中,那么总的数目会有怎样的变化。
因此,我列出了下表:
数组 | 等差数列的数目 | 与上一数组的等差数列数目比较 |
---|---|---|
1 2 3 | 1 | 1 - 0 = 1 |
1 2 3 4 | 3 | 3 - 1 = 2 |
1 2 3 4 5 | 6 | 6 - 3 = 3 |
1 2 3 4 5 6 | 10 | 10 - 6 = 4 |
1 2 3 4 5 6 7 | 15 | 15 - 10 = 5 |
观察就能发现两个等差数列数目之差(表格第三列)就是[1,2, 3, 4, 5……]这个序列,因此每次增加一个等差数列的元素,总的等差数列的数目就会增加[1,2, 3, 4, 5……]中对应的数值。
按照这一点,在代码实现时就设置一个变量addend,表示增加的数目,它对应着[1,2, 3, 4, 5……]这个序列,如果下一个数组元素能够加入到等差数列中,addend就自增1,然后总的数目就增加addend。如果下一个数组元素不能加入到等差数列中,addend就重置为0。这样通过一个循环就能获得结果。
做完看了看其他人的代码,目前发现的最好的解法就是跟我一样的,似乎还没有更好的,其他稍复杂的解法就不贴出来了。
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int count = 0;
int addend = 0;
for (int i = 2; i < A.size(); i++)
if (A[i - 1] - A[i] == A[i - 2] - A[i - 1])
count += ++addend;
else
addend = 0;
return count;
}
};
这道新题虽然长,但是看懂了之后会发现其实不难,就是找找规律而已,所以在纸上写写就能很快做出来了。
今天填了好几个坑,会写两篇解题报告,继续写下一篇!加油加油!