题目
给定一个数组,求数组中所有未等差数组的子数组个数。子数组是数组中连续的序列
代码I(动态规划)
int numberOfArithmeticSlices(int* nums, int numsSize){
if(numsSize<=2){
return 0;
}
int dp[numsSize];
memset(dp,0,sizeof(dp));
int sum = 0;
dp[0] = 0;
dp[1] = 0;
for(int i = 2;i < numsSize;i++){
if(2*nums[i-1] == nums[i-2]+nums[i]){
dp[i] = dp[i-1] + 1;
}else{
dp[i] = 0;
}
sum += dp[i];
}
return sum;
}
分析:
dp[i]表示以第i个元素结尾的等差子数组个数,并且声明一个最终返回的变量sum表示个数。dp[0] = 0,dp[1] = 0。接下来找状态转移方程。对于dp[i]来说如果它满足nums[i]-nums[i-1] = nums[i-1]-nums[i-2]那么就说明该等差数列可以和dp[i-1]相连成一个等差数列。即dp[i] = dp[i-1]+1.为什么这里是加1呢?我们以[1,2,3