413. 等差数列划分
思路:滑动窗口
如何理解每一次贡献值自增?
在三个数情况下
| | |
Ans = 1
在四个数情况下
| | | |
Ans = 1 + 2
在五个数情况下
| | | | |
Ans = 1 + 2 + 3
可以看到,每一次数列长度递增,贡献值增加的是上次增加的值+1
/**
* 413. 等差数列划分
*
*/
public class Solution413 {
public int numberOfArithmeticSlices(int[] nums) {
// 滑动窗口
int len = nums.length;
if (len == 1 || len == 2) {
return 0;
}
// 计算最初始的差值
int difference = nums[0] - nums[1];
// 当前数位的贡献值
int tempAns = 0;
// 结果
int ans = 0;
// 一个等差数列最少有3个数字
for (int i = 2; i < len; i++) {
if (nums[i - 1] - nums[i] == difference) {
// 数列长度+1,贡献值在上一次的基础上+1
tempAns++;
} else {
// 不符合,贡献清零
difference = nums[i - 1] - nums[i];
tempAns = 0;
}
// 添加此次贡献值
ans += tempAns;
}
return ans;
}
}