爆破气球在leetcode中超时

时间:2017-09-06 07:27:49

标签: python algorithm recursion memoization

  

给定n个气球,索引从0到n-1。每个气球都涂有一个由数组nums表示的数字。你被要求爆破所有的气球。如果你爆裂气球我会得到nums [left] * nums [i] * nums [right]硬币。这里左边和右边是i的相邻指数。爆发后,左右相邻。

     

通过明智地爆破气球找到你可以收集的最大硬币。

     

nums = [3,1,5,8] - > [3,5,8] - > [3,8] - > [8] - > []      硬币= 3 * 1 * 5 + 3 * 5 * 8 + 1 * 3 * 8 + 1 * 8 * 1 = 167

我正在抽出一些测试用例。

想知道如何改善?请只给我提示

class Solution(object):
        def recursion(self, nums, index, dp):
            r = -1
            if not nums:
                return 0
            if len(nums) == 1:
                return nums[0]
            if str(nums) in dp:
                return dp[str(nums)]
            if index >= len(nums):
                return 0
            for i in range(len(nums)):
                if i == 0:
                    r = max(r, nums[i]*nums[i+1] + self.recursion(nums[0:i]+nums[i+1:][:], i, dp))
                elif i == len(nums)-1:
                    r = max(r, nums[i-1]*nums[i] + self.recursion(nums[0:i]+nums[i+1:][:], i, dp))
                else:
                    r = max(r, nums[i-1]*nums[i]*nums[i+1] + self.recursion(nums[0:i]+nums[i+1:][:], i, dp))
            dp[str(nums)] = r
            return r

        def maxCoins(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            return self.recursion(nums, 0, {})

1 个答案:

答案 0 :(得分:1)

提示:尽量避免在每次递归中复制列表。

p.s:我非常确定这是一个时间复杂度为O(n ^ 3)的动态编程解决方案。