413. 等差数列划分_动态规划

class Solution(object):
    def numberOfArithmeticSlices(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        if len(A) < 3:
            return 0
        else:
            res = 0
            count = 0

            for i in range(2, len(A)):
                if A[i] - A[i - 1] == A[i - 1] - A[i - 2]:
                    count += 1
                    res += count
                else:
                    count = 0

            return res


# print Solution().numberOfArithmeticSlices([1, 2, 3, 4])
# encoding=utf-8

import sys

'''
A = [1, 2, 3, 4]
return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.
【解题思路】
(1)	定义一个与给定数组一样长度的记录等差数组元素个数的数组
(2)	如果当前数组前面是等差数组就在前面的数组值基础上+1,如果不是就设置当前数组个数为3
(3)	最后返回满足条件的数组的个数
'''

class Solution(object):
    def numberOfArithmeticSlices(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        if len(A)==0 or len(A) == 1 or len(A) == 2:
            return 0
        elif len(A) == 3:
            if (A[1] - A[0]) == (A[2] - A[1]):
                return 1
            else:
                return 0
        else:
            dp = [0] * len(A)

            a=A[1]-A[0]
            b=A[2]-A[1]

            dp[0]=1
            dp[1]=2

            if a==b:
                dp[2]=3
            else:
                dp[2]=2

            for i in range(3,len(A)):
                if (A[i]-A[i-1])==(A[i-1]-A[i-2]):
                    if dp[i-1]>=3:
                        dp[i]=dp[i-1]+1
                    else:
                        dp[i]=3
                else:
                    dp[i]=2

            res=0

            for i in dp:
                if i>=3:
                    res+=(i-3+1)

            return res

A = map(int, sys.stdin.readline().strip().split(","))

print Solution().numberOfArithmeticSlices(A)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值