算法日常・每日刷题--<动态规划>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;

    }
};
相关推荐
YSL0701247 分钟前
一文通关-----排序
数据结构·算法
ZhengEnCi10 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
罗西的思考11 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
夜不会漫长13 小时前
C++:红黑树
数据结构·算法
AI备案指南-满满13 小时前
算法备案审核不通过,一般是什么原因?
java·人工智能·算法·大模型备案·算法备案·大模型登记
Ramble_Naylor14 小时前
Rust深度解读:Send 与 Sync 的本质与线程安全边界
python·算法·rust
秋天的怀念_David14 小时前
算法一千零一夜 · 第二十三夜 电力民生写成的曲线
java·程序人生·算法
不一样的故事12614 小时前
NB/T 47013.8-2015 附录D 吸枪技术
人工智能·经验分享·算法
通问AI14 小时前
用 200 行 Python 给文档库做「上下文完整度」自检:四个可复算的检查项
算法
揽星河..14 小时前
【C语言】扫雷游戏
c语言·算法·游戏