问题描述
即我无法理解为什么在最坏的情况下运行蓝色部分需要(total⋅n⋅2)+1 步。
此屏幕快照来自的视频可以在https://www.youtube.com/watch?v=nqlNzOcnCfs上找到。
解决方法
我没有观看您链接的视频。但是,看一下代码,看起来好像是在使用由数组total
给出的面额的硬币来计算构成值arr
的不同方法的数量。
函数dp
本质上是用值填充字典mem
。字典mem
由total
和i
索引。在递归调用中,total
和i
可能会(并且将会)变小。 total
所采用的新值将在[0; total]
范围内。 i
所采用的新值将在[0; arr.length - 1]
范围内。
因此,词典中可能使用的不同键的数量最多为(total+1) * arr.length
使用已在字典中的dp
和total
的一对值对i
的调用不会导致进一步的递归调用。因此,导致进一步递归调用的对dp
的调用次数最多为(total+1) * arr.length
。
由于每次对dp
的调用最多导致另外2个递归调用,因此对dp
的调用总数最多为2 * (total+1) * arr.length
。就是O(total * arr.length)
。我假设您称之为O(total * n)
。