413. 等差数列划分

如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,以下数列为等差数列: 1, 3, 5, 7, 9
7, 7, 7, 7 3, -1, -5, -9 以下数列不是等差数列。 1, 1, 2, 5, 7 数组 A 包含 N
个数,且索引从0开始。数组 A 的一个子数组划分为数组 (P, Q),P 与 Q 是整数且满足 0<=P<Q<N 。
如果满足以下条件,则称子数组(P, Q)为等差数组: 元素 A[P], A[p + 1], …, A[Q - 1], A[Q]
是等差的。并且 P + 1 < Q 。 函数要返回数组 A 中所有为等差数组的子数组个数。 来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/arithmetic-slices
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

//未优化
bool isDifSequence(int *nums, int start, int end)
{
    int dif = nums[start+1] - nums[start];
    for(int i = start+2; i <= end; i++)
    {
        if(nums[i] - nums[i-1] != dif)
        {
            return false;
        }
    }
    return true;

}

int numberOfArithmeticSlices(int* nums, int numsSize){
    if(numsSize < 3)
    {
        return 0;
    }

    int dp[numsSize];
    memset(dp, 0, sizeof(dp));

    for(int i = 2; i < numsSize; i++)
    {
        dp[i] = dp[i-1];
        for(int j = i-2; j >= 0; j--)
        {
            if(isDifSequence(nums, j, i))
            {
                dp[i] += 1;
            }
        }
    }

    return dp[numsSize-1];

}
//部分优化:
int numberOfArithmeticSlices(int* nums, int numsSize){
    if(numsSize < 3)
    {
        return 0;
    }

    int dp[numsSize][2];
    memset(dp, 0, sizeof(dp));
    dp[0][1] = 0;
    dp[1][1] = nums[1] - nums[0];


    for(int i = 2; i < numsSize; i++)
    {
        dp[i][0] = dp[i-1][0];
        dp[i][1] = nums[i] - nums[i-1];
        for(int j = i-1; j > 0; j--)
        {
            if(dp[i][1] != dp[j][1])
            {
                break;
            }
            dp[i][0] += 1;
        }
    }

    return dp[numsSize-1][0];

}
//优化后的动态规划
int numberOfArithmeticSlices(int* nums, int numsSize){
    if(numsSize < 3)
    {
        return 0;
    }

    int dp[numsSize];
    memset(dp, 0, sizeof(dp));
    int sum = 0;

    for(int i = 2; i < numsSize; i++)
    {
        if(nums[i] - nums[i-1] == nums[i-1] - nums[i-2])
        {
            dp[i] = dp[i-1] + 1;
            sum += dp[i];
        }
        
    }

    return sum;
}

思路:动态规划
题目要求求出等差序列的个数,根据数学推理可得,每个等差序列增加一个等差数,个数就会增加n-2,比如,1,2,3 等差序列为1, 增加一个4后, 增加的个数为2, 为2,3,4; 1,2,3,4,再增加一个数5, 增加的个数为3,为3,4,5;2,3,4,5;1,2,3,4,5;所以状态转移方程:
dp[i] = dp[i-1] + 1 (nums[i] - nums[i-1] == nums[i-1] - nums[i-2])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值