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.等差数列划分相关推荐

  1. leetcode - 413. 等差数列划分

    413. 等差数列划分 -------------------------------------------- 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如 ...

  2. 等差数列java_Java实现 LeetCode 413 等差数列划分

    413. 等差数列划分 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, - ...

  3. Java实现 LeetCode 413 等差数列划分

    413. 等差数列划分 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, - ...

  4. Leetcode 413. 等差数列划分(python)

    如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以下数列不是 ...

  5. LeetCode 413 等差数列划分

    题目描述 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以 ...

  6. [leetcode] 413. 等差数列划分

    一开始想得是这题应该是用动态规划来做,但是没写出来 下面的都是leetcode上的代码: https://leetcode-cn.com/problems/arithmetic-slices/solu ...

  7. leetcode 413. 等差数列划分

    如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以下数列不是 ...

  8. 2022-4-18 Leetcode 413. 等差数列划分

    class Solution {public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size( ...

  9. LeetCode 413. 等差数列划分(DP)

    1. 题目 一个数列的等差数列子数组有多少个. A = [1, 2, 3, 4]返回: 3, A 中有三个子等差数组: [1, 2, 3], [2, 3, 4] 以及自身 [1, 2, 3, 4]. ...

最新文章

  1. live555点播服务器流程深入分析(一)
  2. ASP.NET Web API中的Controller
  3. Java 8 中的工厂方法模式
  4. util-C# 复杂条件查询(sql 复杂条件查询)查询解决方案
  5. 二叉树创建及遍历算法(递归及非递归)(转)
  6. Dapr + .NET 实战(五)Actor
  7. 为什么当代人越来越不快乐?
  8. 智能玩具 数据采集 首页展示 注册 登录 自动登录 二维码图片
  9. eclipse工具中使用Data Source Explorer连接数据库(MySQL)
  10. 【动态规划】01背包:P1049 装箱问题
  11. JAVA轻量级ORM框架JOOQ体验
  12. Qt点击按钮两次才弹出菜单如何解决
  13. PLC通讯实现-C#实现欧姆龙以太网通讯FINS UDP(三)
  14. 最短路径-弗洛伊德算法的java实现
  15. 分数加减乘除混合运算带答案_100道题,分数加减法混合运算,要答案
  16. MySQL LIMIT 理解
  17. 客户流失预测模型python_使用python进行客户流失案例分析
  18. 线性代数---第五章特征值和特征向量
  19. 大数据技术概述__大数据最全面的技术栈总结及分类
  20. uni-app中使用unicloud短信验证码(开通、模板报备、使用)

热门文章

  1. .dll与.lib文件的区别
  2. CSS样式(三) - div盒子
  3. 【树莓派搭建个人网站】环境配置
  4. 结合CmakeList来更好地理解windows下的动态库和静态库
  5. java对象 引用 原理,java对象引用和对象值得行为
  6. wordpress用cdn_如何为WordPress创建自己的自托管CDN
  7. hello world_AngularJS Hello World示例
  8. 在C ++中将String转换为Integer并将Integer转换为String
  9. Android CheckBox
  10. rest教程_REST保证教程