调试中...
调试中...
题目描述
题目描述
题解
题解
提交记录
提交记录
代码
代码
测试用例
测试用例
测试结果
测试结果
简单
相关标签
相关企业
提示

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

注意:本题相对原题稍作改动

 

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。

示例 2:

输入: [2,7,9,3,1]
输出: 12
解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。

示例 3:

输入: [2,1,4,5,3,1,1,3]
输出: 12
解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。
通过次数
89K
提交次数
171.9K
通过率
51.8%

相关标签

相关企业

提示 1
此题有递归和遍历两种解法,但从递归开始可能更容易一些。

提示 2
递归解法:每个预约都有两个选择(接受预约或拒绝预约)。作为一种蛮力方法,你可以在所有可能性的地方递归。但是请注意,如果接收了预约请求i,那么你的递归算法应该跳过预约请求i + 1。

提示 3
递归解法:你可以通过制表法优化这种方法。这种方法的运行时间是多少?

提示 4
递归解法:记忆法的时间复杂度为O(N),空间复杂度也为O(N)。

提示 5
迭代法:对递归法进一步研究。你可以迭代地实现类似的策略吗?

提示 6
迭代法:从数组的末尾开始,然后向后计算可能是最简单的。

提示 7
迭代法:注意,你永远不会连续跳过3个预约。为什么不会?因为你总是可以接受中间的预约。

提示 8
迭代法:如果你选择i,那么将永远不会选择i + 1,但是总会选择i + 2或i + 3。

提示 9
迭代法:使用一个例子并从后往前计算。你可以很容易地找到子数组{rn}、{rn-1, rn}和{rn-2, ..., rn}。如何使用这些结果快速找到{rn-3, ..., rn}的最优解?

提示 10
迭代法:如果你预约某一时间段,那就不能预约紧邻的下一时间段,但可以预约之后的任何时间。因此,optimal(ri, ..., rn) = max(ri + optimal(ri+2, ..., rn),optimal(ri+1, ..., rn))。你可以通过从后往前迭代来解决这个问题。

提示 11
迭代解法:如果你仔细考虑真正需要的数据,应该能够在O(n)时间复杂度和O(1)额外空间复杂度内解出它。

评论 (0)

《程序员面试金典(第 6 版)》独家授权
本书是原谷歌资深面试官的经验之作,帮助了许多想要加入脸书、苹果、谷歌等 IT 名企的求职者拿到 Dream offer。本专题的 100+ 编程面试题是在原书基础上精心挑选出来的,帮助你轻松应战 IT 名企技术面试。
© 2025 领扣网络(上海)有限公司
0 人在线
行 1,列 1
运行和提交代码需要登录
nums =
[1,2,3,1]
Source