题目描述:
给定一个数列,找到所包含的等差数列的数量
解题思路:
还是以往的思路,声明一个dp数组,dp[i]用来存储到第i+1个元素已包含的等差数列数量。现在考虑dp[i]和dp[i+1]之间的关系,如果新加进来的数可以和前面的数构成等差数列的话,那么dp[i]的数量应该在dp[i-1]的基础上增加,增加的量是多少呢?我们可以举一个简单的例子:12345->123456 如果dp[4]=6,dp[5]应该等于10,那么多出来的4个,分别是123456,23456,3456,456,而在dp[i-1]中有12345,2345,345,仔细观察不难发现,其实本质上加的是456,所以我们可以dp[i]=dp[i-1]+1,然后再累加所有的dp
源代码:
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int n=A.size();
if(n<3) return 0;
int result=0;
vector<int> dp(n,0);
if(A[2]-A[1]==A[1]-A[0]) dp[2]=1;
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;
}
for(int i=0;i<n;i++)
result+=dp[i];
return result;
}
};
public:
int numberOfArithmeticSlices(vector<int>& A) {
int n=A.size();
if(n<3) return 0;
int result=0;
vector<int> dp(n,0);
if(A[2]-A[1]==A[1]-A[0]) dp[2]=1;
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;
}
for(int i=0;i<n;i++)
result+=dp[i];
return result;
}
};