码迷,mamicode.com
首页 > 其他好文 > 详细

413. Arithmetic Slices

时间:2018-10-06 19:18:36      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:and   输入   output   返回   python   大于   obj   优化   代码   

问题

一组数如果长度至少为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)

代码

class Solution(object):
    def numberOfArithmeticSlices(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        dp = 0
        res = 0
        for i in range(2,len(A)):
            if(A[i]-A[i-1]==A[i-1]-A[i-2]):
                dp = dp + 1
                res += dp
            else:
                dp = 0
        return res

413. Arithmetic Slices

标签:and   输入   output   返回   python   大于   obj   优化   代码   

原文地址:https://www.cnblogs.com/liaohuiqiang/p/9748088.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!