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

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

题目


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



相关文章
|
6月前
|
机器学习/深度学习 存储 算法
LeetCode 题目 95:从递归到动态规划实现 不同的二叉搜索树 II
LeetCode 题目 95:从递归到动态规划实现 不同的二叉搜索树 II
|
2月前
Leetcode第38题(外观数列)
LeetCode第38题要求生成外观数列的第n项,该数列从数字1开始,每一项都是对前一项的描述,例如第1项是"1",第2项是"11",第3项是"21",以此类推。
35 0
|
4月前
|
存储
LeetCode------斐波那契数列(2)
这篇文章提供了解决LeetCode上"斐波那契数列"问题的两种方法:一种是使用备忘录模式通过递归计算并存储结果以避免重复计算,另一种是自底向上的迭代方法,同时要求结果对1e9+7取模。
LeetCode------斐波那契数列(2)
|
6月前
|
缓存
力扣每日一题 6/14 动态规划+数组
力扣每日一题 6/14 动态规划+数组
41 1
|
6月前
|
存储 算法 数据可视化
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
|
6月前
|
存储 算法 数据可视化
LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树
LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树
|
6月前
|
存储 算法 数据可视化
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
|
6月前
|
存储 算法 数据可视化
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
|
6月前
|
存储 SQL 算法
优化解码方法:记忆化搜索和空间优化动态规划的实用指南 【LeetCode 题目 91】
优化解码方法:记忆化搜索和空间优化动态规划的实用指南 【LeetCode 题目 91】
|
6月前
|
算法 索引
力扣每日一题 6/28 动态规划/数组
力扣每日一题 6/28 动态规划/数组
55 0