本题出自力扣题库第413题。题面大意如下:
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给定一个整数数组 nums ,返回数组 nums中所有为等差数组的子数组个数。
示例:
输入:nums = [1,2,3,4]
输出:3
解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。
题解:
本题的基本思路在于使用一个变量diff来记录当前的相邻元素之差,初始值为nums[1] - nums[0],以及一个变量sliceLen来记录连续等差数列的长度,初始值为1,然后通过一个循环来依次计算数组中的各个元素与之前元素的差,如果结果与diff不相同,修改diff的值并重置sliceLen为2;如果相同则表明连续的等差数列长度在增加,所以递增sliceLen,当sliceLen等于或大于超过3时,符合条件的子数组数量就增加sliceLen - 2个。
Java代码如下:
class Solution {
public int numberOfArithmeticSlices(int[] nums) {
int N = nums.length;
if (N < 3) {
return 0;
}
int count = 0;
int diff = nums[1] - nums[0];
int sliceLen = 2;
for (int i = 2; i < N; i ++) {
int t = nums[i] - nums[i - 1];
if (t == diff) {
sliceLen ++;
if (sliceLen >= 3) {
count += (sliceLen - 2);
}
} else {
sliceLen = 2;
diff = t;
}
}
return count;
}
}