(LC101)413-Arithmetic Slices (Medium)

题目描述
给定一个数组,求这个数组中连续且等差的子数组一共有多少个。
输入输出样例
输入是一个一维数组,输出是满足等差条件的连续字数组个数。

Input: nums = [1,2,3,4]
Output: 3

在这个样例中,等差数列有 [1,2,3][2,3,4] [1,2,3,4]
题解
这道题略微特殊,因为要求是等差数列,可以很自然的想到子数组必定满足 num[i] - num[i-1]
= num[i-1] - num[i-2]。然而由于我们对于 dp 数组的定义通常为以 i 结尾的,满足某些条件的子数
组数量,而等差子数组可以在任意一个位置终结,因此此题在最后需要对 dp 数组求和。

#include<iostream>
#include<vector>
#include<numeric>
using namespace std;

int numberOfArithmeticSlices(vector<int>& nums){
    int n = nums.size();
    if(n < 3){
        return 0;
    }
    vector<int>dp(n,0);
    for(int i=2;i<n;++i){
        if(nums[i] - nums[i-1] == nums[i-1] - nums[i-2]){
            dp[i] = dp[i-1] + 1;
        }
    }
    return accumulate(dp.begin(),dp.end(),0);//计算dp数组的所有元素之和
}

int main(){
    int nums[5] = {1,2,3,4};
    vector<int>nums0(nums,nums+4);
    cout<< numberOfArithmeticSlices(nums0);
    return 0;

}

 

posted @ 2021-06-04 10:42  转角102  阅读(44)  评论(0编辑  收藏  举报