题目:
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。
子数组 是数组中的一个连续序列。
示例1:
输入:nums = [1,2,3,4] 输出:3 解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。
解题思路:
我们以i作为当前等差子数组的左端点,j作为右端点持续右移,找到当前最长的子数组(长度为len)以后,求解其包含的等差数组的个数:
当数组长度为3时,不难发现等差数组的个数为:len-3+1;
当数组长度为1时,等差数组的个数为:1;
根据以上分析,对1-len-3+1,差为1的等差数列求和即为当前子数组包含的等差数组的个数。
遍历到数组n-3下标的位置,将所有子数组包含的等差数组的个数相加,即为答案。
代码示例:
public int numberOfArithmeticSlices(int[] nums) {
int n = nums.length;
int ans = 0;
for (int i = 0; i < n - 2; ) {
int j = i, d = nums[i + 1] - nums[i];
while (j + 1 < n && nums[j + 1] - nums[j] == d) j++;
int len = j - i + 1;
int a1 = 1, an = len - 3 + 1;
int cnt = (a1 + an) * an / 2;
ans += cnt;
i = j;
}
return ans;
}