LeetCode 动态规划之等差数列的划分

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目

如果一个数列至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
例如,[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

题解

解题分析

题解思路
1、边界值判断,首先需要判断数组长度大于等于 3;
2、已知数组是有序的数组,那么我们可以通过判断 nums[i - 1]nums[i]nums[i + 1] 前后的差值是否相等,判断是否等差数列;
3、对于连续的数据数据我们可以通过变量 t 进行累积,判断当前子序列之中的有序情况;
4、最后累积结果得到最终的答案。

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

解题代码

题解代码如下(代码中有详细的注释说明):

class Solution {
    public int numberOfArithmeticSlices(int[] nums) {
        // 数组长度
        int len = nums.length;
        // 不符合最小子数组长度
        if (len < 3) {
            return 0;
        }
        // d 是等差数列的 差值
        // t 是累积连续子数组的长度
        // ans 是返回结果
        int d = nums[1] - nums[0], t = 0, ans = 0;
        for (int i = 2; i < len; i++) {
            // 如果等差数列的等差相同
            if (nums[i] - nums[i - 1] == d) {
                // 增加子数组内累积
                t++;
            } else {
                // 如果不符合
                d = nums[i] - nums[i - 1];
                // 清空累积
                t = 0;
            }
            // 返回结果累积加
            ans += t;
        }
        return ans;
    }
}
复制代码

提交后反馈结果:

image.png

参考信息

力扣(LeetCode)413 题: 等差数列划分

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享