413. Arithmetic Slices

来源:互联网 发布:空性智慧知乎 编辑:程序博客网 时间:2024/06/15 21:09

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, -9

The following sequence is not arithmetic.

1, 1, 2, 5, 7

A 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.


运用动态规划的方法,首先定义一个vector,表示以每个vector下标对应的A中位置的数结尾的arithmetic slices数量,初始化全为0;

首先A中前三个可以确定是否是arithmetic slice,可以得到dp[2]也就是以A[2]为结尾的arithmetic slice数量。然后从A[3]开始根据A[i]-A[i-1] == A[i-1]-A[i-2]确定是否有一个新的arithmetic slice,从而确定dp[i]是否在前面的基础上加1。

将所有的dp值相加即得到arithmetic slices的数量。

代码如下:

class Solution {public:    int numberOfArithmeticSlices(vector<int>& A) {        int n = A.size();        if (n < 3) return 0;        vector<int> dp(n, 0);                if (A[2]-A[1] == A[1]-A[0])             dp[2] = 1;                 int result = dp[2];                for (int i = 3; i < n; ++i)         {            if (A[i]-A[i-1] == A[i-1]-A[i-2])                 dp[i] = dp[i-1] + 1;            result += dp[i];         }        return result;    }};






原创粉丝点击