题目
详解
- 用小范围例子找规律
- dp[i] 表示A[0-i]中有多少等差数列
- 发现如果
A[i]-A[i-1] = A[i-1]A[i-2]
,则增量比上一次的增量大1。不相等则增量=0。
代码
package leetcode.dp;
import java.util.Scanner;
public class NumberOfArithmeticSlices {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
while(s.hasNext()) {
int n = s.nextInt();
int[] A = new int[n];
for(int i=0;i<n;i++) {
A[i] = s.nextInt();
}
System.out.println(numberOfArithmeticSlices2(A));
}
s.close();
}
public static int numberOfArithmeticSlices(int[] A) {
if(A == null || A.length == 0) return 0;
if(A.length < 3) return 0;
int count = 0;
for(int i=0; i<A.length -2 ; i++) {
int d = A[i+1] - A[i];
for(int j=i+2; j<A.length; j++) {
int k = i+1;
for(k=i+1; k<=j; k++) {
if(A[k]-A[k-1] != d)
break;
}
if(k > j)
count++;
}
}
return count;
}
public static int numberOfArithmeticSlices2(int[] A) {
if(A == null || A.length == 0) return 0;
if(A.length < 3) return 0;
int[] dp = new int[A.length];
dp[0] = 0;
dp[1] = 0;
int add = 0;
for(int i=2; i<A.length; i++) {
if((A[i] - A[i-1]) == (A[i-1] - A[i-2])) {
add = add + 1;
}else {
add = 0;
}
dp[i] = dp[i-1] + add;
}
return dp[A.length - 1];
}
}