如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。
例如,以下数列为等差数列:
1 2 3
| 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9
|
以下数列不是等差数列。
数组 A 包含 N 个数,且索引从0开始。数组 A 的一个子数组划分为数组 (P, Q),P 与 Q 是整数且满足 0<=P<Q<N 。
如果满足以下条件,则称子数组(P, Q)为等差数组:
元素 A[P], A[p + 1], …, A[Q - 1], A[Q] 是等差的。并且 P + 1 < Q 。
函数要返回数组 A 中所有为等差数组的子数组个数。
示例:
1 2 3
| A = [1, 2, 3, 4]
返回: 3, A 中有三个子等差数组: [1, 2, 3], [2, 3, 4] 以及自身 [1, 2, 3, 4]。
|
思路:
动态规划:假设已经知道了(a[0]~a[i+1])的等差数组个数为re[i],并且知道了以第i个数结尾的等差数组长度(beforeNumber),计算(a[0]~a[i+2]))数组的等差数组个数,一共4种情况,具体看代码。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { public int numberOfArithmeticSlices(int[] A) { int length =A.length; if(length<3){ return 0; } int[] re=new int[length+1]; re[0]=0; re[1]=0; re[2]=0; int beforeNumber=0; for(int i =3;i<length+1;i++){ boolean isCurrentTrue=isTrue(A[i-1],A[i-2],A[i-3]); if(beforeNumber==0){ if(isCurrentTrue){ re[i]=re[i-1]+1; beforeNumber=3; }else{ re[i]=re[i-1]; } }else{ if(isCurrentTrue){ re[i]=re[i-1]+(beforeNumber-1); beforeNumber++; }else{ re[i]=re[i-1]; beforeNumber=0; } } } return re[length]; } public boolean isTrue(int a,int b ,int c){ return (b-a)==(c-b); } }
|