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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章