我正在解决Cracking the Coding Interview中的问题,如下所示:
一位受欢迎的女按摩师会收到一系列背对背的约会请求,并在争论接受哪些请求。她需要在约会之间休息15分钟,因此她不能接受任何相邻的请求。给定一系列背对背约会请求(所有15分钟的倍数,非重叠,并且不能移动),找到女按摩师可以尊重的最佳(最高总预定分钟数)。返回分钟数。
实施例
输入:{30,15,60,75,45,15,15,45} 输出:180分钟({30,60,45,45})
输入:[75,105,120,75,90,135] 输出:[75,120,135]
我的递归解决方案围绕以下内容展开:
因此,每个元素都可以选择跳过2或跳过3。
教科书递归解决方案的工作原理如下:
我的算法在某种程度上是不正确的吗?或者它只是处理问题的同样最佳方式?两个算法不应该是没有记忆的O(2 ^ N),O(N)和记忆吗?
答案 0 :(得分:1)
你的算法虽然比较复杂,但却是正确的。它没有考虑没有相邻元素的每个子集,但它没有考虑的那些不是最大的,因此不是最优的,因为约会时间都应该是正的。
没有记忆的给定解的运行时间更精确地是Theta(Fib(n)),其中Fib(n)是第n个Fibonacci数(约O(1.62 ^ n))。你的再现是
T(n) = T(n-2) + T(n-3) + T(n-4)
或
T(n) = T(n-2) + 2 T(n-3) + T(n-4)
取决于您是否重复使用maxVal(index + 3)的计算。前一个实现及时运行O(1.47 ^ n);后者,O(1.72 ^ n)。