【leetcode前500】446. 等差数列划分 II - 子序列

我们观察下面的数据长度,那么平方级别时间应该是足够了。

这里示例给了一个很好的例子,可以看出是可以重复的。我们选定一个以x结尾的序列,遍历它前面的数字y,设公差为d,那么以y结尾的所有序列且公差为d的序列个数加1就是以x结尾的公差为d的个数。

需要注意的是,这里公差可能的范围非常大,将二维数组的第二维度换成字典保存公差d,这样就得到下列代码,需要注意的是,最终结果是返回所有可以成为等差序列的序列个数。

class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        ans = 0
        f = [{} for _ in range(len(nums))]
        for i in range(len(nums)):
            for j in range(i):
                d = nums[i] - nums[j]
                cnt = f[j].get(d,0)
                ans += cnt
                f[i][d]=f[i].get(d,0)+cnt+1
        return ans

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值