动态规划之滚动数组

滚动数组是一种节省空间的技巧,常用于递推问题,尤其是动态规划。核心思想是只保留必要的状态,通过取余操作保持较小的数组大小。例如在斐波那契数列的计算中,滚动数组能避免存储所有历史状态,仅保留最后两个状态。同样的原理也可应用于二维数组,提高空间效率。虽然时间复杂度不变,但滚动数组在空间优化上有显著效果。
摘要由CSDN通过智能技术生成

滚动数组

首先什么是滚动数组呢?就是将一个可能有100元素的遍历,我用一个size=2的数组去遍历,这时你可能会问容量为3的数组大小明明小于100啊,为什么可以拿他去遍历100个元素呢?

这时我会用一句话回答你:“具体问题具体分析!”,你有没有想过,如果我遍历过的元素就再也不会使用他了,那我是不是可以将这个元素丢弃呢?

所以滚动数组常常用于解决递推问题,我在上一章就说过:“递推数组的核心思想就是数学归纳法,而数学归纳法的第二步就是通过前一个状态的运算得到当前状态”,那么假设我第十个状态的结果只要知道第九个状态的具体情况,那我还需要第一个,第二个,第三个。。。。状态的情况吗?是不是不需要了,那就可以舍弃掉了,这是滚动数组就派上用场了。

中上,如果问题的解决对于子问题的答案并不需要进行存储,那么就可以利用滚动数组的思想解决问题,更加的节省空间。

滚动数组的核心:取余

我见过的所有使用滚动数组的技巧就是取余,这样不管遍历到多大的下标值,你都可以一个小的下标值进行表示,让新的答案覆盖掉原来旧的答案。

举个例子

对于斐波那契数列F[n] = F[n - 1] + F[n - 2]有两种写法;
普通的写法:

    void func1()
{
   
    int d[101] = {
   0};
    d[0] = 1;
    d[1] = 1;
    for (int i = 2; i 
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值