等差数列子数组
原题在这里:
概述:在给定数组中,求连续子数组为等差数组(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】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!