题解:「力扣」第 413 题:等差数列划分(中等)

发布于 2021-09-08 10:32 ,所属分类:数学资料学习库

上方程序员小熊,回复算法pythonC++5121024,即可获取海量学习资料!

今天和大家分享的是「力扣」第 413 题:等差数列划分。这道题可以使用「滑动窗口」,也可以使用「动态规划」。

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。

  • 例如,[1,3,5,7,9][7,7,7,7][3,-1,-5,-9] 都是等差数列。

给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。

子数组 是数组中的一个连续序列。

示例 1:

输入:nums =[1,2,3,4]
输出:3
解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4]和[1,2,3,4]自身。

示例 2:

输入:nums =[1]
输出:0

提示:

  • 1 <= nums.length <= 5000
  • -1000 <= nums[i] <= 1000

理解题意

  • 关键字:至少有三个元素;
  • 子数组 是数组中的一个连续序列,「连续」这两个字重要;
  • 求个数,不用求具体的连续子数组是哪些。

思路分析

  • 暴力解法,可以枚举所有长度大于

    长度为

    因此,长度为 的等差数列对结果的贡献为:

    虽然上式需要在

    参考代码 2

    publicclassSolution{

    publicintnumberOfArithmeticSlices(int[]nums){
    intlen=nums.length;
    if(len<3){
    return0;
    }

    // dp[i]表示以:nums[i]结尾的、且长度大于等于 3 的连续子数组的个数
    int[]dp=newint[len];
    intres=0;
    //从下标 2 开始,才有可能构成长度至少大于等于 3 的等差数列
    for(inti=2;i<len;i++){
    if(nums[i]-nums[i-1]==nums[i-1]-nums[i-2]){
    dp[i]=dp[i-1]+1;
    res+=dp[i];
    }
    }
    returnres;
    }
    }

    说明nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2] 这么写隐含了判断等差数列的长度大于等于

相关资源