dp之等差数列划分

leetcode 413 等差数列划分

题目描述

如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。

A = [1, 2, 3, 4]
返回: 3, A 中有三个子等差数组: [1, 2, 3],
[2, 3, 4] 以及自身[1, 2, 3, 4]

我们看到后首先会想:这个数列必须连续,我们能不能暴力获取到所有情况呢?写一个方法判断数列是否等差,然后获取到数列所有组合情况。答案是肯定可以,但是时间复杂度呢?
我们想要获取到这个数列得组合情况
在这里插入图片描述
我们时间复杂度为

n-2 + n-3 + ’‘’‘’‘’ 1

是一个 O(N^2)级别复杂度
我们判断一个数列是否为等差数列 :
我们需要遍历这个数列

for(size_t i = 1;i < vec.size() - 1;++i)
{
	if(vec[i] - vec[i - 1] != vec[i+1] - vec[i])
	{
		return false;
	}
}
return true;

这又是个O(N)级别复杂度,综合我们暴力求解这个算法所需时间复杂度O(N^3)。不采取

我们发现,等差数列要求连续并且这个数列长度要大于3,那么如果这个数列等差,所出现结果和这个数列里得数值并没有关系,而是和数列长度有关系。而这个关系就是在等差数列插入一个值后如果依旧构成等差数列,这个增值构成差后等差数列。
举个例子:
在这里插入图片描述
我们就很快能够写出
差后等差

我们想获取到6 1 + 2 + 3 
res += ++add;
int numberOfArithmeticSlices(vector<int>& nums)
{
        if(nums.size() <= 2)
        {return 0;}
        int res = 0;
        int add = 0;
        for(int  i= 2;i < nums.size();++i)
        {
            if(nums[i - 1] - nums[i] == nums[i - 2] - 		nums[i - 1])
            {res += ++add;}
            else
            add = 0;
        }
        return res;
    }

我们就快速将这个时间复杂度降低到了O(N)级别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值