动态规划(数组区间)---数组中等差递增子区间的个数

数组中等差递增子区间的个数

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;
}
posted @ 2019-07-01 20:10  yjxyy  阅读(487)  评论(0编辑  收藏  举报