https://leetcode-cn.com/problems/arithmetic-slices/
思路:显然可以通过双指针找到等差数列的区间
[
l
,
r
]
[l,r]
[l,r],那么依据题目的定义,分别统计长度为
3
、
4
、
5...
3、4、5...
3、4、5...的等差数列的个数即可,即:
(
r
−
l
−
2
)
+
(
r
−
l
−
3
)
+
.
.
.
+
1
(r-l-2)+(r-l-3)+...+1
(r−l−2)+(r−l−3)+...+1。这不就是等差数列的和嘛,可以
O
(
1
)
O(1)
O(1)求得,因此算法的总复杂度为
O
(
n
)
O(n)
O(n)。
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
int l=0,r=1,n=nums.size(),ans=0;
while(r<n)
{
int dis=nums[r]-nums[l];
while(r+1<n&&nums[r+1]-nums[r]==dis)
++r;
int num=r-l+1;
ans+=max(0,(num-2)*(num-1)>>1);
l=r;
r=l+1;
}
return ans;
}
};