题目: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:
1, 3, 5, 7, 9
7, 7, 7, 7
3, -1, -5, -9
The following sequence is not arithmetic.
1, 1, 2, 5, 7
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:
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.
难度:medium 通过率:53.3%
这道题的题目写了很多东西,一开始看了是不知道要求什么的 ,然后再看了一下例子,原来粗暴地理解就是要求所给序列里存在多少个长度不小于3的等差数列 。
想着从头到尾遍历一次,但是怎么判断符合条件子序列的数目呢?
于是列了几个例子总结出了规律:
序列 | 符合子序列数目 | 规律 |
---|---|---|
[1,2,3] | 1 | 1 |
[1,2,3,4] | 3 | 1+2 |
[1,2,3,4,5] | 6 | 1+2+3 |
[1,2,3,4,5,6] | 10 | 1+2+3+4 |
由以上表格可知,如果成连续子序列每多一个元素即在原来的数目上加一个递增的数,从0开始递增,所以,可以直接从头开始遍历序列,用变量temp记录递增数,count记录总数目,当下一个数和前面的序列不成等差数列时,temp再次等于0,由此遍历下去。代码如下,复杂度O(n)
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int size = A.size();
int count = 0;
int temp = 0;
if(size < 3) {
return 0;
}
int diff = A[1]-A[0];
for(int i = 2; i < size; i++) {
if(A[i]-A[i-1] == diff) {
temp++;
count += temp;
}
else {
diff = A[i]-A[i-1];
temp = 0;
}
}
return count;
}
};