Leetcode-413 等差數列劃分

題目鏈接

今天的我,就是覺得自己不是在做算法題,做的就是數學題!找規律…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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章