算法沉淀——动态规划篇(子数组系列问题(下))

本文详细介绍了动态规划在四个经典问题中的应用:等差数列划分、最长湍流子数组、单词拆分以及环绕字符串中唯一子字符串的计数。每个问题都阐述了状态转移方程的推导和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

几乎所有的动态规划问题大致可分为以下5个步骤,后续所有问题分析都将基于此

  • 1.、状态表示:通常状态表示分为以下两种,其中更是第一种为主。

    • 以i为结尾,dp[i] 表示什么,通常为代求问题(具体依题目而定)
    • 以i为开始,dp[i]表示什么,通常为代求问题(具体依题目而定)
  • 2、状态转移方程

    • 以上述的dp[i]意义为根据, 通过最近一步来分析和划分问题,由此来得到一个有关dp[i]的状态转移方程。
  • 3、dp表创建,初始化

    • 动态规划问题中,如果直接使用状态转移方程通常会伴随着越界访问等风险,所以一般需要初始化。而初始化最重要的两个注意事项便是:保证后续结果正确,不受初始值影响;下标的映射关系
    • 初始化一般分为以下两种:
      • 直接初始化开头的几个值。
      • 一维空间大小+1,下标从1开始;二维增加一行/一列
  • 4、填dp表、填表顺序:根据状态转移方程来确定填表顺序。

  • 5、确定返回值

一、等差数列划分

【题目】:413. 等差数列划分
【题目】:

 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
 给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。(子数组 是数组中的一个连续序列)

【示例】:

输入:nums = [1,2,3,4]
输出:3
解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。

【分析】:
 我们可以定义dp[i]表示以i为结尾,等差数组的子数组个数。之后我们可以通过判断(nums[i]、nums[i-1]、nums[i-2])是否构成等差数列,来进一步分析

状态转移方程推导:

  1. 如果nums[i]、nums[i-1]、nums[i-2]不构成等差数列,显然此时以i为结尾的等差数组的子数组个数为0。即dp[i] = 0;
  2. 如果构成等差数列,此时dp[i]的值至少为1。此时我们还需加上dp[i-1]的值。原因在于如果以i-1为结尾的等差数列存在,此时该等差数列公差为dp[i-1] -dp[i-2]。同时nums[i]、nums[i-1]、nums[i-2]构成等差数列,公差也为dp[i-1] -dp[i-2]。这也意味着,以i-1为结尾的所有等差数列,在添加新增nums[i]元素后,依然是等差数列。所以状态转移方程为dp[i] = dp[i - 1] + 1;

细节处理:
 显然当i为1、2时,状态转移方程不适用。我们由于dp[0]、dp[1]一定构不成等差数列,所以我们可以先将dp[0]、dp[1]先初始化为0,在从下标2开始,从左往右填表。

【代码编写】:

class Solution {
   
public:
    int numberOfArithmeticSlices(vector<int>& nums) {
   
        int n = nums.size();
        vector<int> dp(n);
        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;
            ret +=
### 关于水排序算法 水排序并非一种传统意义上的计算机科学中的经典排序算法,也未被广泛记录在标准的算法教材或学术论文中。然而,基于自然界水流行为的启发式方法确实存在一些研究方向,这些方法试图模拟自然现象来解决计算问题。 #### 启发自自然界的排序概念 某些非传统的排序方法受到物理过程的启发,例如流体力学中的液体流动特性。如果假设“水排序”指代的是某种受水流运动规律影响的设计,则可以推测其核心思想可能是通过模仿液态物质分层沉淀的现象完成数据整理工作[^4]。具体而言: - 数据项如同不同密度的小球悬浮于容器之中; - 当施加外力使体系达到稳定状态后,较重者下沉而轻质者上浮形成有序分布; 这种机制类似于沉降法分离颗粒物的技术路线,在理论上能够映射至数组元素间的比较与交换操作序列之上。 #### 可能的伪代码描述 尽管缺乏确切定义,下面给出一段示意性质的Python风格伪代码表示如何依据上述思路构建简易版“仿生型”排序逻辑: ```python def water_sort(array): n = len(array) while True: swapped = False for i in range(0, n - 1): if array[i] > array[i + 1]: # Swap elements as they 'settle' temp = array[i] array[i] = array[i + 1] array[i + 1] = temp swapped = True if not swapped: break return array ``` 此版本实际上退化成了经典的冒泡排序形式[^5],但它直观体现了所谓“让数值像水中杂质那样逐渐沉积”的理念。 #### 性能考量 由于此类设想本质上仍需依赖两两对比调整位置关系才能达成全局最优解,所以时间复杂度通常不会优于已知高效方案如快速排序(O(n log n))。不过,在特殊应用场景下——比如硬件电路设计领域利用重力效应自动分类物体重量时,“物理层面的真实水排序装置”或许具备独特优势[^6]。 ---
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白debug~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值