[LeetCode] 413. Arithmetic Slices

[LeetCode] 413. Arithmetic Slices

题目描述

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

分析

这里需要找到一个数列中等差的子数列的个数,因此可以通过计算每两个数之间的差值,当差值一直相等时,说明这是一个连续的等差子数列,直到差值变化再重新看。

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

如果使用动态规划解决这个问题,则查看当前位置的前后是否为等差数列,如果是,那么当前位置与之前的数形成等差数列的个数为前一个位置加一,把各个位置形成的等差数列相加就是最后的结果。

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

猜你喜欢

转载自blog.csdn.net/weixin_39629939/article/details/78416102