1. 解析
题目大意,计算满足以下条件的子序列个数:
①子序列连续且至少有3个元素
②子序列相邻两个元素之间的间距相等(即等差序列)
2. 分析
整体上这道题并不是很难,只是需要我们找一下规律。例如:[1, 2, 3, 5, 7, 9, 11]
很容易看出存在两个等差序列:
1, 2, 3 间距为1
3, 5, 7, 9, 11 间距为2
对于n个元素的等差序列存在 ( n >= 3)个等差子序列,例如 3, 5, 7, 9, 11的子序列为
3, 5, 7 5, 7, 9 7, 9, 11 3, 5, 7, 9 5, 7, 9, 11 3, 5, 7, 9, 11
即(5-1) * (5-2) / 2 = 6 个。
从以上我们可以分析出,我们只需按照相邻元素之间的间距就可以划分出不同的子序列,用dis表示当前两个元素的间距,判断下一个元素是否在这个子序列当中,如果间距和dis相等,意味着这个元素属于当前子序列,继续往后检索直到间距不等于当前的dis,即当前的序列已经结束,判断序列当中的元素的个数是否大于或等于3,如果满足,计算当前序列所包含子序列的个数;更新当前的dis,继续往下搜索......
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
if (A.size() < 3) return 0;
int res = 0;
int count = 2; //同等间距的元素的个数
int dis = A[1] - A[0]; //当前的间距
for (int i = 2; i < A.size(); i++){
if (dis == A[i]-A[i-1]){
count++;
if (i == A.size() - 1)
res += (count-1) * (count-2) / 2;
}
else{
if (count >= 3)
res += (count-1) * (count-2) / 2;
count = 2;
dis = A[i]-A[i-1]; //更新当前的距离
}
}
return res;
}
};