经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
413. Arithmetic Slices
来源:cnblogs  作者:PilgrimHui  时间:2018/10/8 8:49:44  对本文有异议

问题

一组数如果长度至少为3,且相邻数的差都相同,则称这组数是算术的(其实就是长度大于2的等差数列)。
数组A包含N个数,如果有0<=P<Q<N,使得A[P], A[P+1], ..., A[Q]是算术的,则称这段数字为A的算数片。
输入数组A,要求返回数组A的算术片的个数。

Input: [1,2,3,4]
Output: 3
Explanation: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4]

思路

用dp[i]表示以A[i]结尾的子数组的算术片个数,当加入A[i+1]时有两种情况。

第一种情况是满足A[i+1]-A[i] == A[i] - A[i-1],以A[i]结尾的子数组的算术片个数可以叠加到A[i+1]上,同时对于A[i+1]会多1,因为原来{A[i-1], A[i]}并不构成算术片,但是加入A[i+1]后可以构成算术片{A[i-1], A[i], A[i+1]}。因此可以得到:\(dp[i+1] = dp[i] + 1\)

第二种情况就是不满足A[i+1]-A[i] == A[i] - A[i-1],此时置0,即:\(dp[i+1] = 0\)

dp数组可以优化成单个dp值,所以在迭代的过程中把所有的dp值加起来即可。

时间复杂度O(n),空间复杂度O(1)

代码

  1. class Solution(object):
  2. def numberOfArithmeticSlices(self, A):
  3. """
  4. :type A: List[int]
  5. :rtype: int
  6. """
  7. dp = 0
  8. res = 0
  9. for i in range(2,len(A)):
  10. if(A[i]-A[i-1]==A[i-1]-A[i-2]):
  11. dp = dp + 1
  12. res += dp
  13. else:
  14. dp = 0
  15. return res
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号