话不多说直接上代码:
class Solution {
public int numberOfArithmeticSlices(int[] nums) {
if(nums.length<3){
return 0;
}
int continual=0;
int count=0;
for(int i = 2; i < nums.length; i++){
if(nums[i]-nums[i-1] == nums[i-1]-nums[i-2]){
continual++;
}
else{
continual = 0;
}
count+=continual;
}
return count;
}
}
以下我来解释一下我自己对这段代码的理解和感受
等差数列顾名思义即数列中相邻数的差值相等,所以要牢牢把握nums[i]-nums[i-1] == nums[i-1]-nums[i-2]这个核心。题目的要求是找出为等差数组的 子数组 个数。这有点像小学时候看立体图数正方体的题目。例如一个简单数列{1,2,3,4,5}中,元素最少的等差子数列有三个元素,而元素最多的子数列有五个元素。一定要注意避免漏数因小数列“耦合”成的较大数列。
continual即数列中从某个元素(即“起始元素”)开始连续等差的某段子数列下,当前元素nums[i-1]距离“起始元素”的距离。
如上述例子中{1,2,3,4,5},当循环执行到对{1,2,3}进行判断时,以{1,2,3}即唯一等差子数列,则continual和count均为1;
当循环执行到对{2,3,4}进行判断时,以{2,3,4}为基础向左边延伸的等差子数列还有{1,2,3,4},则continual为2,count = 1+2;
当循环执行到对{3,4,5}进行判断时,以{3,4,5}为基础向左边延伸的等差子数列还有{2,3,4,5}和{1,2,3,4,5},则continual为3,count = 1+2+3;
以此类推,即可不漏一项得统计出等差子数列的个数