等差数列子数组

原题在这里

概述:在给定数组中,求连续子数组为等差数组(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 @   Renhr  阅读(58)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示