美文网首页
每日一题20201130(面试题 17.16. 按摩师)

每日一题20201130(面试题 17.16. 按摩师)

作者: 米洛丶 | 来源:发表于2020-11-30 19:49 被阅读0次

    面试题 17.16. 按摩师

    image-20201130194133134

    思路

    典型的动态规划题目,存在多个子问题。这题与打家劫舍一模一样
    
    这边我们设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
    }
    
    
    image-20201130194020286
    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
    
    image-20201130194844069

    相关文章

      网友评论

          本文标题:每日一题20201130(面试题 17.16. 按摩师)

          本文链接:https://www.haomeiwen.com/subject/qqsdwktx.html