Target Sum

Posted 唐僧洗发爱飘柔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Target Sum相关的知识,希望对你有一定的参考价值。

    这道题为中等题

  题目:

    

 

  思路:

    1、我最开始的思路:利用DFS,把它当成一个二叉树,但是结果超时,很疑惑,在网上查找,好像是没有进行尾递归优化,具体的尾递归概念大家可以百度一下

    2、还是使用DFS,但是利用字典存储中间值

    3、利用DP,利用两个字典,字典的键为一个数,键值表示为到达该数有多少种途径,每次循环之后就要用另一个字典进行覆盖

  代码:

    我的超时代码:

 1 class Solution(object):
 2     def findTargetSumWays(self, nums, S):
 3         """
 4         :type nums: List[int]
 5         :type S: int
 6         :rtype: int
 7         """
 8         return self.dfs(nums, S, 0, 0, len(nums))
 9         
10     def dfs(self, nums, S, index, total, list_long):
11         if index >= list_long:
12             if total == S: return 1
13             else: return 0
14         return self.dfs(nums, S, index+1, total+nums[index], list_long) + self.dfs(nums, S, index+1, total-nums[index], list_long)

    另一种DFS代码(AC):

 1 class Solution(object):
 2     def findTargetSumWays(self, nums, S):
 3         """
 4         :type nums: List[int]
 5         :type S: int
 6         :rtype: int
 7         """
 8         def findTarget(i, s):
 9             if (i, s) not in cache:
10                 r = 0
11                 if i == len(nums):
12                     if s == 0:
13                         r = 1
14                 else:
15                     r = findTarget(i+1, s-nums[i]) + findTarget(i+1, s+nums[i])
16                 cache[(i, s)] = r
17             return cache[(i, s)]
18         
19         cache = {}
20         return findTarget(0, S)

 

    DF代码(AC):

 1 class Solution(object):
 2     def findTargetSumWays(self, nums, S):
 3         from collections import defaultdict
 4         memo = {0: 1}
 5         for x in nums:
 6             m = defaultdict(int)
 7             for s, n in memo.iteritems():
 8                 m[s + x] += n
 9                 m[s - x] += n
10             memo = m
11         return memo[S]

 

以上是关于Target Sum的主要内容,如果未能解决你的问题,请参考以下文章

解决移动端报错:Unable to preventDefault inside passive event listener due to target being treated as……(代码片段

LeetCode 494. Target Sum

Two Sum

我的javascript片段返回“非法字符”

LeetCode 40 Combination Sum II(数组中求和等于target的所有组合)

494. Target Sum