Leetcode 413. Arithmetic Slices(python+cpp)

Leetcode 413. Arithmetic Slices

题目

在这里插入图片描述

解析:一维动态规划

  • 这道题目的dp比较特殊,不同于以往dp[i]的定义,这边的dp[i]代表在i这个位置能够组成的新的arithmetic slices。
  • 为什么这么定义呢?因为我们可以发现,对于i这个位置来说,能够组成的新的arithmetic slices比i - 1的位置多一个。也就是dp[i] = dp[i-1]+1。
  • 为什么是这样的关系呢?因为当我们现在有了一个新元素A[i]的时候,如果A[i]符合条件的话,意味着之前i - 1位置的arithmetic slices都可以在后面接上A[i-1]形成dp[i-1]个新的slices。除此之外,将A[i]和它前面的两个元素组成的slice也一定在之前没有出现,因为slice的最小长度为3
  • 由于dp定义的特殊性,所以最后的结果是dp数组的sum
    python代码如下:
class Solution:
    def numberOfArithmeticSlices(self, A: List[int]) -> int:
        n = len(A)
        dp = [0]*n
        for i in range(2,n):
            if A[i]-A[i-1] == A[i-1]-A[i-2]:
                dp[i] = dp[i-1]+1
        return sum(dp)

当然这道题目可以进一步做个状态压缩,也就是所谓的constant space dynamic programming。因为dp[i]只与dp[i-1]有关,所以dp数组可以用一个变量来代替。

  • 要注意的是,一旦出现的新元素不符合之前的等差,那么当前的dp变量要清0
    python代码如下:
class Solution:
    def numberOfArithmeticSlices(self, A: List[int]) -> int:
        n = len(A)
        curr = _sum = 0
        for i in range(2,n):
            if A[i]-A[i-1] == A[i-1]-A[i-2]:
                curr += 1
                _sum += curr
            else:
                curr = 0
        return _sum

C++代码如下:

  • C++用accumulate函数求和,accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值。
class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& A) {
        int n = A.size();
        vector<int> dp(n,0);
        for (int i=2;i<n;++i){
            if (A[i]-A[i-1] == A[i-1]-A[i-2]){
                dp[i] = dp[i-1]+1;
            }
        }return accumulate(dp.begin(),dp.end(),0);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值