题目:
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.
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.
题目解析:
题目要求找到所有arithmetic slices的个数。根据example可以看出后一个数组和前一个数组的arithmetic slices个数有关。因此运用动态规划的思想,写出状态转移方程:
nums[i]=nums[i−1]+consecutiveLen
nums[i]表示的是在前i个数的arithmetic slices的个数。此外,再用一个consecutiveLen来记录与第i个数相邻中等差数列的长度。
源代码:
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
if (A.size() < 3) return 0;
int nums[A.size()];
memset(nums, 0, sizeof(nums));
int conLen = 0, d = 0;
if (A[2] - A[1] == A[1] - A[0]) {
conLen = 1;
nums[2] = 1;
}
d = A[2] - A[1];
for (int i = 3; i < A.size(); i++) {
A[i] - A[i - 1] != d? conLen = 0: conLen++;
d = A[i] - A[i - 1];
nums[i] = nums[i - 1] + conLen;
}
return nums[A.size() - 1];
}
};