题目描述
给定一个数组,求这个数组中连续且等差的子数组一共有多少个。
输入输出样例
输入是一个一维数组,输出是满足等差条件的连续字数组个数。
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; }