今天的我,就是覺得自己不是在做算法題,做的就是數學題!找規律…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;
}
};