Side Topic: 空间优化的一般技巧

情况1:一条线: 一维dp array

case1: dp[i] only depends on dp[i-1] --> O(1)的空间就可以

case2: dp[i] not only depends on dp[i-1]

情况2:一个面:二维dp matrix

假如我们的情况是从左到右,从上到下更新的过程

  • 结论1:两行肯定没问题,我们一定不需要多于两行

  • 优化方法1:用mod符号

    • example

    • dp[i][j] = dp[i -1][j - 1] + dp[i-1][j] + dp[i][j - 1]

    • dp[i % 2][j] = dp[(i -1) % 2][j - 1] + dp[(i-1) % 2][j] + dp[i % 2][j - 1]

    • 优点:比较快速的可以写出来,缺点没有做到最优,可能可以更经济 O(n^2) -> O(n)

  • 优化方法2:一行可不可以呢?

    • 直接写遇到的问题,dp[i - 1][j - 1]这个值,其实已经被我在更新dp[i][j - 1]的时候给抹掉了,现在就没法更新dp[i][j]了

    • 我现在正在填写dp[i-1][j], 我正在抹掉dp[i -1][j], 现在正在抹掉的值,就是我下一次更新dp[i][j+1]的时候,所需要的左上角

    • 那我就记下来

      • int[] dp <- new int[column length]

      • base case here:

        • 从上倒下更新,For i from 0 to last row:

          • int已经抹掉的左上角 = 0;

          • 从左到右更新:for j from 0 to last col:

            // we need to fill in dp[j] here

            • int 即将要抹掉正上方 = dp[j]

            • dp[j] updated by (即将要抹掉的正上方,已经抹掉的左上角, dp[j -1])

            • 已经抹掉的左上角 = 即将要抹掉的正上方

Last updated