今天的我,就是觉得自己不是在做算法题,做的就是数学题!找规律…QAQ
我の解
sub[i]=A[i+1]-A[i]
原数组转化为一个差值数组,问题转化为差值数组中有多少个连续的相等值
。
dp:记录相等值的个数,res:记录最后的结果
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
if(A.size()<=2) return 0;
vector<int> sub(A.size(),INT_MIN);
for(int i=0;i<A.size()-1;i++)
{
sub[i]=A[i+1]-A[i];
}
int dp=1,res=0;
for(int i=1;i<A.size();i++)
{
if(sub[i]!=sub[i-1])
{
if(dp>=2)
res+=dp*(dp-1)/2;
dp=1;
}
else
dp++;
}
return res;
}
};
DP
总感觉与其说是DP,不如说是组合数的拆开算。
本质上还是考虑以A[i]为最后元素的等差数组数,不过这样是每一个满足的都算,上面解法是不满足的时候算组合数。
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
if(A.size()<=2) return 0;
int res=0,dp=1;
for(int i=2;i<A.size();i++)
{
if(A[i]-A[i-1]==A[i-1]-A[i-2])
{
res+=dp;
dp++;
}
else
dp=1;
}
return res;
}
};