413. Arithmetic Slices

来源:互联网 发布:c语言不合理的地方 编辑:程序博客网 时间:2024/06/05 16:06
A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same.For example, these are arithmetic sequence:1, 3, 5, 7, 97, 7, 7, 73, -1, -5, -9The following sequence is not arithmetic.1, 1, 2, 5, 7A zero-indexed array A consisting of N numbers is given. A slice of that array is any pair of integers (P, Q) such that 0 <= P < Q < N.A slice (P, Q) of array A is called arithmetic if the sequence:A[P], A[p + 1], ..., A[Q - 1], A[Q] is arithmetic. In particular, this means that P + 1 < Q.The function should return the number of arithmetic slices in the array A.Example:A = [1, 2, 3, 4]return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.
  • 此题解法比较简单,找到以A[i]为结尾的最大等差数列(A[j],…,A[i]),即可计算出i到j之间所有的等差子数列数目dp[i]。以次再找出A[j-1]之前的等差子序列数目dp[j-1]。然后将得出的数目进行相加即可得到结果。
class Solution {public:    int combinationN_3(int n){        return (n-2)*(n-1)/2;    }    int numberOfArithmeticSlices(vector<int>& A) {        vector<int>  dp(A.size(),0);        int n = A.size();        int sum = 0;        if(n <= 2){            return 0;        }        for(int i = 2; i < n; ++i ){            if((A[i] - A[i-1]) == (A[i-1] - A[i-2])){                dp[i] = dp[i-1] + 1;            }        }        for(int i = n-1;i>=2;){            if(dp[i]>0){                sum += combinationN_3(dp[i]+2);                i = i - (dp[i]+2);            }else{                i--;            }                  }        return sum;    }};
原创粉丝点击