思路
比较奇怪的题目,实际就是给N个数,求里面的所有长度至少为3的等差数列的个数。例如数组[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]
。
对于长度为N的等差数列,其包含的长度不小于3的等差数列个数是: (N-3+1 + N-4+1 + ... + 2 + 1) = 1 + 2 + ... + N - 2 = (N-1)(N-2)/2
,所以双指针找数组中最长的等差数列然后根据长度计算结果即可。
(这竟然是medium)
代码
class Solution {
public:
int numberOfArithmeticSlices(vector<int> &A) {
const int sz = (int)A.size();
if (sz < 3)
return 0;
auto resOfN = [](int n) {
return (n - 1) * (n - 2) / 2;
};
int res = 0;
int i = 2, j = 0;
while (i < sz) {
while (i < sz && A[i] - A[i - 1] == A[i - 1] - A[i - 2])
i++;
if (i - j >= 3) {
res += resOfN(i - j);
j = i - 2;
} else { // i did not move
j = i - 1;
i++;
}
}
return res;
}
};