原題連結: 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;
}
複製程式碼