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)级别