为什么这个时间复杂度为Ototal * n?

问题描述

即我无法理解为什么在最坏的情况下运行蓝色部分需要(total⋅n⋅2)+1 步。

这是函数代码

Implementation

此屏幕快照来自的视频可以在https://www.youtube.com/watch?v=nqlNzOcnCfs上找到。

解决方法

我没有观看您链接的视频。但是,看一下代码,看起来好像是在使用由数组total给出的面额的硬币来计算构成值arr的不同方法的数量。

函数dp本质上是用值填充字典mem。字典memtotali索引。在递归调用中,totali可能会(并且将会)变小。 total所采用的新值将在[0; total]范围内。 i所采用的新值将在[0; arr.length - 1]范围内。

因此,词典中可能使用的不同键的数量最多为(total+1) * arr.length

使用已在字典中的dptotal的一对值对i的调用不会导致进一步的递归调用。因此,导致进一步递归调用的对dp的调用次数最多为(total+1) * arr.length

由于每次对dp的调用最多导致另外2个递归调用,因此对dp的调用总数最多为2 * (total+1) * arr.length。就是O(total * arr.length)。我假设您称之为O(total * n)