一、题意
如果一个数列至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。给你一个整数数组nums,返回数组nums中所有为等差数组的子数组(下标是连续的)个数。
二、解法
解法:
差分+计数
计算以nums[i]和nums[i-1]结尾的等差数列的数量
c
n
t
i
cnt_i
cnti,逆序遍历所有nums[i]和nums[i-1]对,将结果加起来。
以nums[i+1]和nums[i]结尾的等差数列的数量
c
n
t
i
+
1
=
c
n
t
i
+
1
cnt_{i+1}=cnt_{i}+1
cnti+1=cnti+1,因为以nums[i+1]和nums[i]结尾的等差数列包含了nums[i]和nums[i-1],相当于在其后面添加num[i+1],多出一组nums[i+1],nums[i],nums[i-1]。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
三、代码
解法:
int numberOfArithmeticSlices(vector<int>& nums) {
int n =nums.size();
if(n<3){
return 0;
}
int cnt=0;
int ans = 0;
int prev = nums[1]-nums[0],nv=0;
for(int i=2;i<n;i++){
int v = nums[i]-nums[i-1];
if(v==prev){
cnt++;
}
else{
prev= nums[i]-nums[i-1];
cnt=0;
}
ans+=cnt;
}
return ans;
}
四、总结
自己想的时候,想着找到他们之间的规律,写了半天,写得很复杂,但结果还是错的。
五、引用
[1] leetcode:413. Arithmetic Slices
[2] leetcode:413. Arithmetic Slices官方解法