如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。
子数组 是数组中的一个连续序列。
解题思路:
设置一个arr数组,其中arr[i]表示以nums[i]为结尾的等差数列子数组的总个数,假设nums=[1,2,3,4,6,7,8],则arr=[0,0,1,2,0,0,1],而最终要返回的答案实际上就是arr数组中所有数值的和。因此我们的任务就是要构造arr数组。
当(nums[i]-nums[i-1]) !=(nums[i -1]-nums[i-2])时,很明显arr[i]就是0。
当(nums[i]-nums[i-1])==(nums[i -1]-nums[i-2])时,此时arr[i]的值与arr[i-1]的值相关。能发现,只要在以nums[i-1]为结尾的所有等差数列子数组后添加一个nums[i],就能形成新的一系列以nums[i]为结尾的等差数列子数组,即我们可以得到arr[i-1]个以nums[i]为结尾的数组。此外,还要在arr[i-1]的基础上再增加1,因为{nums[i-2],nums[i-1],nums[i]}是满足要求的子数组,但在计算arr[i-1]时,{nums[i-2],nums[i-1]}虽然以nums[i-1]结尾但并不算时等差数组。
也就是说,当(nums[i]-nums[i-1])==(nums[i -1]-nums[i-2])时,arr[i]=arr[i-1]+1。
代码如下:
public int numberOfArithmeticSlices(int[] nums) {
int[] arr = new int[nums.length];
int res = 0;
for (int i = 2; i < nums.length; i++) {
if (nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]) {
arr[i] = arr[i - 1] + 1;
} else {
arr[i] = 0;
}
res += arr[i];
}
return res;
}