算法日常・每日刷题--<动态规划>23

413. 等差数列划分 - 力扣(LeetCode)

题目描述

如果一个数列至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的子数组个数。

子数组:数组中连续的一段元素。

示例: 输入:nums = [1,2,3,4] 输出:3 解释:三个等差子数组:[1,2,3]、[2,3,4]、[1,2,3,4]

思路分析(动态规划)

核心定义

dp[i]:以 nums i 结尾的、满足条件的等差子数组数量。

  1. 边界条件:
    • 数组长度小于 3,直接返回 0,无法形成等差数列。
    • dp[0]=0、dp[1]=0,前两个元素无法构成子数组。
  2. 状态转移方程:
    • 如果 nums[i]-nums[i-1] == nums[i-1]-nums[i-2](公差相等): dp[i] = dp[i-1] + 1 理解:在以i-1结尾的等差子数组基础上,新增nums[i],会多出1 个新的等差子数组
    • 公差不相等:dp[i]=0,以i结尾没有等差子数组
  3. 结果:把全部dp[i]累加,就是总的等差子数组数量。

举例子 [1,2,3,4] i=2:1,2,3 等差 → dp 2=1,ret=1 i=3:2,3,4 等差 → dp 3=dp 2+1=2,ret=1+2=3,和答案一致

cpp 复制代码
class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& nums) {
        int n=nums.size();
        if(n==1||n==2)return 0;
        vector<int>dp(n,0);
        dp[0]=0,dp[1]=0;
        int ret=0;
        for(int i=2;i<n;i++)
        {
            if(nums[i]-nums[i-1]==nums[i-1]-nums[i-2])
            dp[i]=dp[i-1]+1;
            else
            dp[i]=0;
            ret+=dp[i];
        }
        return ret;

    }
};
相关推荐
GreatSQL社区1 小时前
主从复制SQL线程中断——字符集砸出的坑
java·数据库·算法
Tisfy2 小时前
LeetCode 2333.最小差值平方和:排序 + 数学计算(不用二分)
数学·算法·leetcode·题解·贪心·排序
aqiu1111112 小时前
【C++算法打怪专栏】LeetCode 217. 存在重复元素(解法总结)
c++·算法·leetcode
yi0114 小时前
DAY28: LeetCode 111. 二叉树的最小深度
人工智能·笔记·python·算法·leetcode·二叉树·递归
wuyk5554 小时前
27.LeetCode 2265. 统计值等于子树平均值的节点数 —— 后序遍历实战
stm32·单片机·嵌入式硬件·算法
xiangyun614 小时前
C++ list 模拟实现(二):const迭代器与反向迭代器,模板的黑魔法
开发语言·数据库·c++·算法·stl·list
xxwl5854 小时前
三、区域赛算法模版第三章---字符串相关算法
笔记·学习·算法
信奥卷王5 小时前
[GESP202509 六级] 划分字符串(含视频)
数据结构·算法
酒醉的胡铁5 小时前
相似度搜索的常见算法
算法·ai