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 题: 等差数列划分



相关文章
|
3月前
代码随想录 Day46 动态规划14 LeetCode T392 判断子序列 T115 不同的子序列
代码随想录 Day46 动态规划14 LeetCode T392 判断子序列 T115 不同的子序列
37 0
|
3月前
【Leetcode 2645】构造有效字符串的最小插入数 —— 动态规划
状态定义:`d[i]`为将前 i 个字符拼凑成若干个 abc 所需要的最小插入数。状态转移方程: 如果` word[i]>word[i−1]`,那么`word[i]`可以和`word[i−1]`在同一组 abc 中,`d[i]=d[i−1]−1` ;否则`word[i]`单独存在于一组 abc 中,`d[i]=d[i−1]+2`
|
1月前
|
Go C++
【力扣】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
【2月更文挑战第17天】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
30 8
|
1月前
动态规划之解码方法【LeetCode】
动态规划之解码方法【LeetCode】
|
1月前
动态规划之使用最小花费爬楼梯【LeetCode】
动态规划之使用最小花费爬楼梯【LeetCode】
|
1月前
|
算法
动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】
动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】
|
2月前
|
机器学习/深度学习 人工智能 测试技术
【动态规划】【矩阵快速幂】LeetCode2851. 字符串转换
【动态规划】【矩阵快速幂】LeetCode2851. 字符串转换
|
3月前
|
算法 C++ 机器人
力扣 C++|一题多解之动态规划专题(1)
力扣 C++|一题多解之动态规划专题(1)
41 0
力扣 C++|一题多解之动态规划专题(1)
|
3月前
代码随想录 Day47 动态规划15 LeetCode T583 两个字符串的删除操作 T72 编辑距离
代码随想录 Day47 动态规划15 LeetCode T583 两个字符串的删除操作 T72 编辑距离
33 0
|
3月前
代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和
代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和
38 0