Leetcode 413.等差数列划分
Time: 20190906
Type: Medium
题目描述
以下数列不是等差数列。
1, 1, 2, 5, 7
数组 A 包含 N 个数,且索引从0开始。数组 A 的一个子数组划分为数组 (P, Q),P 与 Q 是整数且满足 0<=P<Q<N 。
如果满足以下条件,则称子数组(P, Q)为等差数组:
元素 A[P], A[p + 1], …, A[Q - 1], A[Q] 是等差的。并且 P + 1 < Q 。
函数要返回数组 A 中所有为等差数组的子数组个数。
示例:
A = [1, 2, 3, 4]
返回: 3, A 中有三个子等差数组: [1, 2, 3], [2, 3, 4] 以及自身 [1, 2, 3, 4]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/arithmetic-slices
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
本题也是DP算法,定义f[i]
表示以到i
元素为止的等差数列个数。因为等差数列只有3个和3个元素以上才有等差的意义因此,我们从f[2]
开始往后计算。
当A[i] - A[i-1] = A[i-1] - A[i-2]
时,表示至少过去3个元素是等差数列。这是新增的,且f[i-1]
如果不为0,则表示在过去3个元素中,有延续。
f[i] = f[i-1] + 1
若过去三个元素是等差。
f
初始化是全部为0的。下面举两个典型的例子来说明状态转移方程:
- [1,2,3,4,5,6]
- [1,2,3,7,8,9]
从3开始,f[2] = 1
,因为过去3个元素1,2,3是等差的。现在观察4,过去三个元素2,3,4也是等差的,f[2]
大于0,表示4和过去4个元素也能凑成等差。可以观察到一个性质,如果在等差数列之后出现一个非下一个等差元素,f[i]
就不会被更新,就是初始值0。
因此,f[3] = f[2] + 1 => 2
,表示[2,3,4], [1,2,3,4]。
再看元素5,求f[4]
,过去三个元素3,4,5满足等差,f[3]
对应的数列补上元素5还是等差,加上新开拓的[3,4,5]
,得出f[4] = f[3] + 1 ⇒ 3
。
注意这种得出的结果,最后全部累加才是最后的结果。
第二种情况里,在等差数列之后出现非下一个等差元素,f
数组元素为0。
不再多说,理解本题的动态规划,核心在于理解这个性质:
如果在等差数列之后出现一个非下一个等差元素,
f[i]
就不会被更新,就是初始值0。
代码
class Solution:def numberOfArithmeticSlices(self, A: List[int]) -> int:# 至少3个才叫数列,才有等差这种概念# f[i]表示到i元素为止的等差数列个数,差(d)是一样的# A[i] - A[i-1]等于A[i-1] - A[i-2],则f[i] = f[i-1] + 1# 从左往右更新n = len(A)f = [0] * nif n < 3:return 0# f[0], f[1], f[2]for i in range(2, n):if A[i] - A[i-1] == A[i-1] - A[i-2]:f[i] = f[i-1] + 1# print(f)return sum(f)
END.
Leetcode 413.等差数列划分相关推荐
- leetcode - 413. 等差数列划分
413. 等差数列划分 -------------------------------------------- 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如 ...
- 等差数列java_Java实现 LeetCode 413 等差数列划分
413. 等差数列划分 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, - ...
- Java实现 LeetCode 413 等差数列划分
413. 等差数列划分 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, - ...
- Leetcode 413. 等差数列划分(python)
如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以下数列不是 ...
- LeetCode 413 等差数列划分
题目描述 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以 ...
- [leetcode] 413. 等差数列划分
一开始想得是这题应该是用动态规划来做,但是没写出来 下面的都是leetcode上的代码: https://leetcode-cn.com/problems/arithmetic-slices/solu ...
- leetcode 413. 等差数列划分
如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以下数列不是 ...
- 2022-4-18 Leetcode 413. 等差数列划分
class Solution {public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size( ...
- LeetCode 413. 等差数列划分(DP)
1. 题目 一个数列的等差数列子数组有多少个. A = [1, 2, 3, 4]返回: 3, A 中有三个子等差数组: [1, 2, 3], [2, 3, 4] 以及自身 [1, 2, 3, 4]. ...
最新文章
- live555点播服务器流程深入分析(一)
- ASP.NET Web API中的Controller
- Java 8 中的工厂方法模式
- util-C# 复杂条件查询(sql 复杂条件查询)查询解决方案
- 二叉树创建及遍历算法(递归及非递归)(转)
- Dapr + .NET 实战(五)Actor
- 为什么当代人越来越不快乐?
- 智能玩具 数据采集 首页展示 注册 登录 自动登录 二维码图片
- eclipse工具中使用Data Source Explorer连接数据库(MySQL)
- 【动态规划】01背包:P1049 装箱问题
- JAVA轻量级ORM框架JOOQ体验
- Qt点击按钮两次才弹出菜单如何解决
- PLC通讯实现-C#实现欧姆龙以太网通讯FINS UDP(三)
- 最短路径-弗洛伊德算法的java实现
- 分数加减乘除混合运算带答案_100道题,分数加减法混合运算,要答案
- MySQL LIMIT 理解
- 客户流失预测模型python_使用python进行客户流失案例分析
- 线性代数---第五章特征值和特征向量
- 大数据技术概述__大数据最全面的技术栈总结及分类
- uni-app中使用unicloud短信验证码(开通、模板报备、使用)
热门文章
- .dll与.lib文件的区别
- CSS样式(三) - div盒子
- 【树莓派搭建个人网站】环境配置
- 结合CmakeList来更好地理解windows下的动态库和静态库
- java对象 引用 原理,java对象引用和对象值得行为
- wordpress用cdn_如何为WordPress创建自己的自托管CDN
- hello world_AngularJS Hello World示例
- 在C ++中将String转换为Integer并将Integer转换为String
- Android CheckBox
- rest教程_REST保证教程