等差数列子数组

原题在这里

概述:在给定数组中,求连续子数组为等差数组(len>2)的数量。

  analyse:

  1.因为数据量很小,所以写了暴力dfs查找

code:

class Solution
{
    int ans, l;
    vector<int> n;
    vector<vector<int>> m;
    void dfs(int x, int y, int z) //当前值下标为x,数量为y,差值为z
    {
        // cout << n[x] << " = 当前下标:" << x << ", 当前数量:" << y << ", 当前差值" << z << endl;
        if (y > 2)
            ans++;
        if (y == 1)
        {
            //找差值
            // for (int i = x + 1; i < l - 1; ++i)
            //     cout << "way1" << endl, dfs(i, y + 1, n[i] - n[x]);
            if (x + 1 < l - 1)
                dfs(x + 1, y + 1, n[x + 1] - n[x]);
        }
        else
        {
            //继续找差值为z的后续值 下标必须大于x
            for (int i = 0; n[x] + z + 1000 >= 0 && i < m[n[x] + z + 1000].size(); ++i)
            {
                int to = m[n[x] + z + 1000][i];
                if (to == x + 1) // if (to > x)
                    dfs(to, y + 1, z);
            }
        }
    }

public:
    int numberOfArithmeticSlices(vector<int> &nums)
    {
        n = nums, l = n.size();
        m = vector<vector<int>>(3000, vector<int>());
        for (int i = 0; i < l; ++i)
            m[n[i] + 1000].emplace_back(i); //数据范围为[0,2000]
        for (int i = 0; i < l - 2; ++i)
            dfs(i, 1, 0);
        return ans;
    }
};
刚开始误解了题意,以为不是连续也可以,所以这个是处理非连续形的简改代码

  2.组合数学,一个等差数列长度为len,那么所有len>2的子数组数量为(len-1)*(len-2)/2,实际上也就是从1+...+len-2

code:

class Solution
{
public:
    int numberOfArithmeticSlices(vector<int> &nums)
    {
        int ans = 0, l = nums.size();
        for (int i = 2; i < l; ++i)
        {
            int j = 0;
            while (i < l && nums[i - 2] + nums[i] == nums[i - 1] * 2)
                ans += ++j, ++i;
        }
        return ans;
    }
};

 

 

【Over】

posted @ 2022-03-30 13:16  Renhr  阅读(65)  评论(0)    收藏  举报