数组中等差递增子区间的个数
413. Arithmetic Slices (Medium)
A = [0, 1, 2, 3, 4]
return: 6, for 3 arithmetic slices in A:
[0, 1, 2],
[1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3, 4],
[ 1, 2, 3, 4],
[2, 3, 4]
题目描述:
给定一个数组,求数组中等差递增子区间的个数。
思路分析:
动态规划思想,用dp[i]表示以A[i]结尾的数组中有多少递增等差区间。当 A[i] - A[i-1] == A[i-1] - A[i-2],那么 [A[i-2], A[i-1], A[i]] 构成一个等差递增子区间。而且在以 A[i-1] 为结尾的递增子区间的后面再加上一个 A[i],一样可以构成新的递增子区间。
综上,在 A[i] - A[i-1] == A[i-1] - A[i-2] 时,dp[i] = dp[i-1] + 1。
因为递增子区间不一定以最一个元素为结尾,可以是任意一个元素结尾,因此需要返回 dp 数组累加的结果。
代码:
public int numberOfArithmeticSlices(int []A){
if(A==null||A.length==0)
return 0;
int []dp=new int [A.length];
for(int i=2;i<A.length;i++){
if(A[i]-A[i-1]==A[i-1]-A[i-2]){
dp[i]=dp[i-1]+1;
}
}
int res=0;
for(int cnt:dp)
res=res+cnt;
return res;
}