原题链接: Arithmetic Slices
###题目大意:
题目说了一大堆,其实都是在给定义,目标就一句话:
求一个给定数组中可以组成多少个等差数列(长度大于3)
###解题思路:
首先呢,一个长度为n的等差数列,设m=n-2,则包括子数列在内,一共可以组成m*(1+m)/2个长度大于3的等差数列,简单的数列求和。
然后只要知道数组中每个等差数列的长度即可。
设置两个标记start和end,分别代表当前等差数列的开始和结束为止。
设置标记sub,记录数列差值,当差值与上次不等时,将start设置为end-1,即为重新开始一个新的数列。此时应将上一数列的统计数目添加到总数count中。
###AC代码:
/**
* 413. Arithmetic Slices
* @param A
* @return
*/
public static int numberOfArithmeticSlices(int[] A){
if(A.length<3)
return 0;
int start = 0,end = 1;
int sub = A[end]-A[start],count=0;
for(end = 1;end <A.length;end++){
if(A[end]-A[end-1]!=sub||end == A.length-1){
if(end-start>=2){
int l = end-start-1;
if(A[end]-A[end-1]!=sub){
l-=1;
}
count+= l*(1+l)/2;
}
start = end-1;
sub = A[end]-A[start];
}
}
return count;
}
复制代码