1️⃣题目描述

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。

  • 例如,[1,3,5,7,9][7,7,7,7][3,-1,-5,-9] 都是等差数列。
    给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。

子数组 是数组中的一个连续序列。

示例1:

示例2:

注意:

  • 1 <= nums.length <= 5000
  • -1000 <= nums[i] <= 1000

2️⃣题目解析

解题思路如下:

  • 整个程序从第三个元素开始遍历序列。对于每一个位置i,首先判断前两个元素nums[i-2]、nums[i-1]和当前元素nums[i]是否构成等差数列。如果构成等差数列,那么dp[i]的值就可以通过dp[i-1] + 1计算得到。其中dp[i-1]表示以前一个元素为结尾的等差数列的个数,而加上当前元素后形成了以当前元素为结尾的新的等差数列。如果不构成等差数列,那么dp[i]的值就设为0,代表不以当前元素为结尾的等差数列个数为0。

3️⃣解题代码

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

最后就通过啦!!!

【算法|动态规划No.19】leetcode413. 等差数列划分-LMLPHP

10-15 03:51