每日一题20201130(面试题 17.16. 按摩师)
面试题 17.16. 按摩师
思路
典型的动态规划题目,存在多个子问题。这题与打家劫舍一模一样
这边我们设f(n)为接纳前N个客户的时长, a为预约数组
当n = 0的时候,显然f(n) = 0
当n = 1的时候,显然f(n) = a[n]
当n >= 2的时候,f(n) = max(f(n-2) + a[n], f(n-1))
分2种情况,接纳第n个客户的话,那么就不能接相邻的客户a[n-1]了,所以总数为f(n-2) + a[n]
如果不接纳第n个客户,那么总数就和f(n-1)一样了。我们是为了求最大的解,所以要取2者的最大值。
// 这不就是打家劫舍吗?
func massage(nums []int) int {
// 假设她不接第n个人
// n == 1 f(n) = a[n]
// n == 2 f(n) = max(a[n], a[n-1])
// f(n) = max(f(n-1), f(n-2)+a[n])
if len(nums) == 0 {
return 0
}
first, second := 0, nums[0]
for i:=1;i<len(nums);i++ {
first, second = second, max(first+nums[i], second)
}
return second
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
class Solution:
def massage(self, nums: List[int]) -> int:
if len(nums) == 0:
return 0
first, second = 0, nums[0]
for n in nums[1:]:
first, second = second, max(first+n, second)
return second
本文作者:米洛丶
本文链接:https://www.cnblogs.com/we8fans/p/14063214.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
leetcode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步