运用算法:动态规划
状态定义:
状态1:arry[i][0]表示以nums[i]结尾,向前看,能够组成的最长等差数列所含有的元素个数。
状态2:arry[i][1]表示以nums[i]结尾,向前看,所组成的等差数列的公差。
状态的转移:对于下标i来说,具体处理过程如下:
1、判断当前的元素是否能够加入前面的等差数列
2、当能够加入时(公差相等),arry[i][0] = arry[i - 1] [0]+1;arry[i][1] = arry[i - 1][1];
3、当不能加入时(公差不相等),那么下标i与下标i-1不管如何都会构成一个等差数列,所以将arry[i][0] = 2 ; arry[i][1] = nums[i] - nums[i - 1];
注意:
代码如下:
int numberOfArithmeticSlices(int* nums, int numsSize){
int arry[numsSize][2];
int ret = 0;
//初始化:
arry[0][0] = 1;
arry[0][1] = 0;
//核心算法:
for(int i = 1 ; i < numsSize ; i++)
{
if(arry[i - 1][1] == 0)
{
arry[i][0] = 2;
arry[i][1] = nums[i] - nums[i - 1];
}
if(nums[i] - nums[i - 1] == arry[i - 1][1])
{
//说明符合等差数列的要求
arry[i][1] = arry[i - 1][1];
arry[i][0] = arry[i - 1][0] + 1;
if(arry[i][0] == 3)
{
ret++;
}
if(arry[i][0] > 3)
{
ret += arry[i][0] - 2;
}
}
if(arry[i - 1][1] != 0 && nums[i] - nums[i - 1] != arry[i - 1][1])
{
//不符合等差数列的要求
arry[i][0] = 2;
arry[i][1] = nums[i] - nums[i - 1];
}
}
return ret;
}